Πρόβλημα με JComboBox

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Fairy
Gbyte level
Gbyte level
Posts: 1733
Joined: Tue Jan 24, 2006 4:48 pm
Academic status: Alumnus/a
Gender:
Location: Mairyland Park

Πρόβλημα με JComboBox

Post by Fairy » Sun Feb 17, 2008 1:41 am

Σε μια java Application υλοποιώντας Swing έχω το εξής πρόβλημα:

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

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

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

Δοκίμασα να φτιάξω actionListener εσωτερικής τάξης για το ίδιο το Combobox. Αυτό έλυνε το πρόβλημα αλλά για κάποιο λόγο το πρώτο αντικέιμενο δεν δημιουργείται ποτέ και πετά του κόσμου τα exceptions... Το δεύτερο λειτουργεί κανονικά!!!
"Αν αυτό που έκανες χτες σου φαίνεται ακόμα μεγάλο, δεν έχεις κάνει αρκετά σήμερα."
The Punisher
Venus Former Team Member
Posts: 7561
Joined: Thu Oct 27, 2005 1:43 pm
Academic status: Alumnus/a
Gender:
Location: Boston, MA

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

Post by The Punisher » Sun Feb 17, 2008 2:00 am

Μια ιδιαιτερότητα είναι πως το Combobox δημιουργείται δυναμικά κάθε φορά που πατώ το κουμπί
δηλαδή κάθε φορά που πατάς το κουμπί τι γίνεται? παίρνεις την επιλεγμένη τιμή και μετά φτιάχνεις ένα καινούργιο?

το κομμάτι κώδικα του listener μπορείς να το παραθέσεις?
User avatar
Fairy
Gbyte level
Gbyte level
Posts: 1733
Joined: Tue Jan 24, 2006 4:48 pm
Academic status: Alumnus/a
Gender:
Location: Mairyland Park

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

Post by Fairy » Sun Feb 17, 2008 2:22 am

Δυναμική δημιουργία περιεχομένων 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);    //δημιουργώ αντικείμενο
            
               [....] κώδικας [.........] 
        }

κ.τ.λ. 
        			
        	
"Αν αυτό που έκανες χτες σου φαίνεται ακόμα μεγάλο, δεν έχεις κάνει αρκετά σήμερα."
User avatar
cyberpython
Mbyte level
Mbyte level
Posts: 654
Joined: Wed Nov 21, 2007 8:18 pm
Academic status: Alumnus/a
Gender:
Location: Αθηνα
Contact:

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

Post by cyberpython » Sun Feb 17, 2008 1:05 pm

Λοιπόν... Η παρακάτω τάξη κατασκευάζει ένα 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" }));
Post Reply

Return to “Προγραμματισμός”