Page 1 of 1

Πρόβλημα με JComboBox

Posted: Sun Feb 17, 2008 1:41 am
by Fairy
Σε μια java Application υλοποιώντας Swing έχω το εξής πρόβλημα:

Όταν πατάμε ένα JButton επιθυμώ να λαμβάνω μια τιμή από ένα JComboBox και κατόπιν να περνά σαν παράμετρος σε κατασκευαστή αντικειμένου.

Αν χρησιμοποιήσω εσωτερική τάξη ActionListener στο JButton και βάλω στην actionPerformed την εντολή
κάτι = όνομα_κόμπομποξ.getSelectedItem();
δουλεύει περίφημα, για ένα όμως πάτημα του κουμπιού! Αν το ξαναπατήσω, όλα τα νέα αντικείμενα δημιουργούνται με παράμετρο την πρώτη πρώτη σειρά του μενού του ComboBox...

Στο παρελθόν έχω χρησιμοποιήσει άπειρες φορές τη μέθοδο getSelectedItem και πρώτη φορά τρώω τέτοιο κόλλημα. Μια ιδιαιτερότητα είναι πως το Combobox δημιουργείται δυναμικά κάθε φορά που πατώ το κουμπί (χαζό αλλά υπάρχει λόγος...) Αλλά αν αυτό ήταν το πρόβλημα η πρώτη φορά γιατί δουλεύει;

Δοκίμασα να φτιάξω actionListener εσωτερικής τάξης για το ίδιο το Combobox. Αυτό έλυνε το πρόβλημα αλλά για κάποιο λόγο το πρώτο αντικέιμενο δεν δημιουργείται ποτέ και πετά του κόσμου τα exceptions... Το δεύτερο λειτουργεί κανονικά!!!

Re: Πρόβλημα με JComboBox

Posted: Sun Feb 17, 2008 2:00 am
by The Punisher
Μια ιδιαιτερότητα είναι πως το Combobox δημιουργείται δυναμικά κάθε φορά που πατώ το κουμπί
δηλαδή κάθε φορά που πατάς το κουμπί τι γίνεται? παίρνεις την επιλεγμένη τιμή και μετά φτιάχνεις ένα καινούργιο?

το κομμάτι κώδικα του listener μπορείς να το παραθέσεις?

Re: Πρόβλημα με JComboBox

Posted: Sun Feb 17, 2008 2:22 am
by Fairy
Δυναμική δημιουργία περιεχομένων panel m2 από κουμπί

Code: Select all

<όνομα_κουμπιού>.addActionListener(new ActionListener()
         {
           public void actionPerformed( ActionEvent e )
          {
            [.........] κώδικας που κάνει διάφορα[.............]
        	       			        			        			
        	int x = cat_names.size();					      
               String [] arra = new String[x];				         			
               for(int a = 0; a < x; a++)
         	{
         		arra[a] = (String)cat_names.elementAt(a);
         	}
         	right2 = new JComboBox(arra);      			     			
        	m2.add(right2);
        	m2.updateUI()
           }	  	
        }
    });


Το κουμπί που χρησιμοποιεί το combo του παραπάνω panel (επικοινωνούν κατάλληλα)

Code: Select all

<άλλο κουμπί>.addActionListener(new ActionListener()
       {
         public void actionPerformed( ActionEvent e )
         {
            [....] κώδικας [.........] 
       			
        	cate = right2.getSelectedItem().toString();
                Category pho_cat = (Category) categories.get(cate);           //παίρνω τιμή από ένα map
                Photo ph = new Photo(fname, fpath, pho_cat, commen);    //δημιουργώ αντικείμενο
            
               [....] κώδικας [.........] 
        }

κ.τ.λ. 
        			
        	

Re: Πρόβλημα με JComboBox

Posted: Sun Feb 17, 2008 1:05 pm
by cyberpython
Λοιπόν... Η παρακάτω τάξη κατασκευάζει ένα JFrame με ένα JButton, ένα JCombobox και ένα JLabel που όταν πατηθεί το JButton τότε το Label παίρνει την τιμή που έιναι επιλεγμένη στο JCombobox (ο κώδικας που έγραψα εγώ είναι μόλις 3 γραμμες :

Code: Select all

String s;
        s = (String) jComboBox1.getModel().getSelectedItem();
        jLabel1.setText(s);
όλα τα υπόλοιπα τα κάνει το NetBeans!

Αντί για String μπορείς να βάλεις ότι Object θελεις....
).

Code: Select all


/*
 * NewJFrame.java
 *
 * Created on 17 Φεβρουάριος 2008, 12:55 μμ
 */

/**
 *
 * @author  cyberpython
 */
public class NewJFrame extends javax.swing.JFrame {
    
    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        jComboBox1 = new javax.swing.JComboBox();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        jButton1.setText("jButton1");
        jButton1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton1MouseClicked(evt);
            }
        });

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        jLabel1.setText("jLabel1");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(82, 82, 82)
                .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 157, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 33, Short.MAX_VALUE)
                .addComponent(jButton1)
                .addGap(40, 40, 40))
            .addGroup(layout.createSequentialGroup()
                .addGap(46, 46, 46)
                .addComponent(jLabel1)
                .addContainerGap(309, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(44, 44, 44)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(100, 100, 100)
                .addComponent(jLabel1)
                .addContainerGap(116, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>                        

    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {                                      
// TODO add your handling code here:
        String s;
        s = (String) jComboBox1.getModel().getSelectedItem();
        jLabel1.setText(s);
    }                                     
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
    
}


Οι γραμμές που προσθέτουν τον EventListener για το JButton:

Code: Select all

jButton1.addMouseListener(
          new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton1MouseClicked(evt);
            }
        }
);
Και η δημιουργία του Model του JComboBox :

Code: Select all

jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));