Σε μια java Application υλοποιώντας Swing έχω το εξής πρόβλημα:
Όταν πατάμε ένα JButton επιθυμώ να λαμβάνω μια τιμή από ένα JComboBox και κατόπιν να περνά σαν παράμετρος σε κατασκευαστή αντικειμένου.
Αν χρησιμοποιήσω εσωτερική τάξη ActionListener στο JButton και βάλω στην actionPerformed την εντολή
κάτι = όνομα_κόμπομποξ.getSelectedItem();
δουλεύει περίφημα, για ένα όμως πάτημα του κουμπιού! Αν το ξαναπατήσω, όλα τα νέα αντικείμενα δημιουργούνται με παράμετρο την πρώτη πρώτη σειρά του μενού του ComboBox...
Στο παρελθόν έχω χρησιμοποιήσει άπειρες φορές τη μέθοδο getSelectedItem και πρώτη φορά τρώω τέτοιο κόλλημα. Μια ιδιαιτερότητα είναι πως το Combobox δημιουργείται δυναμικά κάθε φορά που πατώ το κουμπί (χαζό αλλά υπάρχει λόγος...) Αλλά αν αυτό ήταν το πρόβλημα η πρώτη φορά γιατί δουλεύει;
Δοκίμασα να φτιάξω actionListener εσωτερικής τάξης για το ίδιο το Combobox. Αυτό έλυνε το πρόβλημα αλλά για κάποιο λόγο το πρώτο αντικέιμενο δεν δημιουργείται ποτέ και πετά του κόσμου τα exceptions... Το δεύτερο λειτουργεί κανονικά!!!
Πρόβλημα με JComboBox
- Fairy
- Gbyte level
- Posts: 1733
- Joined: Tue Jan 24, 2006 4:48 pm
- Academic status: Alumnus/a
- Gender: ♀
- Location: Mairyland Park
Πρόβλημα με JComboBox
"Αν αυτό που έκανες χτες σου φαίνεται ακόμα μεγάλο, δεν έχεις κάνει αρκετά σήμερα."
-
- Venus Former Team Member
- Posts: 7561
- Joined: Thu Oct 27, 2005 1:43 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Boston, MA
Re: Πρόβλημα με JComboBox
δηλαδή κάθε φορά που πατάς το κουμπί τι γίνεται? παίρνεις την επιλεγμένη τιμή και μετά φτιάχνεις ένα καινούργιο?Μια ιδιαιτερότητα είναι πως το Combobox δημιουργείται δυναμικά κάθε φορά που πατώ το κουμπί
το κομμάτι κώδικα του listener μπορείς να το παραθέσεις?
- Fairy
- Gbyte level
- Posts: 1733
- Joined: Tue Jan 24, 2006 4:48 pm
- Academic status: Alumnus/a
- Gender: ♀
- Location: Mairyland Park
Re: Πρόβλημα με JComboBox
Δυναμική δημιουργία περιεχομένων panel m2 από κουμπί
Το κουμπί που χρησιμοποιεί το combo του παραπάνω panel (επικοινωνούν κατάλληλα)
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); //δημιουργώ αντικείμενο
[....] κώδικας [.........]
}
κ.τ.λ.
"Αν αυτό που έκανες χτες σου φαίνεται ακόμα μεγάλο, δεν έχεις κάνει αρκετά σήμερα."
- cyberpython
- Mbyte level
- Posts: 654
- Joined: Wed Nov 21, 2007 8:18 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Αθηνα
- Contact:
Re: Πρόβλημα με JComboBox
Λοιπόν... Η παρακάτω τάξη κατασκευάζει ένα JFrame με ένα JButton, ένα JCombobox και ένα JLabel που όταν πατηθεί το JButton τότε το Label παίρνει την τιμή που έιναι επιλεγμένη στο JCombobox (ο κώδικας που έγραψα εγώ είναι μόλις 3 γραμμες :
όλα τα υπόλοιπα τα κάνει το NetBeans!
Αντί για String μπορείς να βάλεις ότι Object θελεις....
).
Οι γραμμές που προσθέτουν τον EventListener για το JButton:
Και η δημιουργία του Model του JComboBox :
Code: Select all
String s;
s = (String) jComboBox1.getModel().getSelectedItem();
jLabel1.setText(s);
Αντί για 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
}
Code: Select all
jButton1.addMouseListener(
new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jButton1MouseClicked(evt);
}
}
);
Code: Select all
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));