Προς το περιεχόμενο

Java ComboBox


giovannim

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα παιδία. Έχω ένα πρόβλημα με ένα comboBox. Θέλω να εμφανίζονται π.χ. οι μέρες τις εβδομάδας όπως το έχω πιο κάτω, αλλά με την εντολή getSelectedItem να μου επιστρέφει κάποιες άλλες τιμές, όχι εκείνες από τις ημέρες, όπως π.χ. {2, 5, 7, 9, 10}

Για να καταλάβετε, θέλω να συνδέσω το combo box με μία βάση δεδομένων, όπου θα είναι αποθηκευμένες σε μία κολόνα οι τιμές id και στην άλλη τα ονόματα. Θέλω στο comboBox να εμφανίζονται τα ονόματα, αλλά όταν γίνεται η επιλογή να μου επιστρέφει εκείνες που αντιστοιχούν στην κάθε τιμή του id. Έχω καταφέρει να "φορτώσω" το combobox με τις τιμές που θέλω, αλλά δεν τα καταφέρνω στην επιστροφή. Κάποια βοήθεια;

>String[] days = {"Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή"};

JComboBox daysList = new JComboBox(days)
.
.
.
getSelectedItem();

Δημοσ.

Έχω καιρό να γράψω Java και δεν θυμάμαι αλλά δεν σε βολεύει να φτιάξεις μια μέθοδο που να καλεί την getSelectedItem, να κάνει έναν έλεγχο, και να σου επιστρέψει ανάλογη τιμή;

 

edit: Και κοιτώντας το api βλέπω ότι στο JComboBox μπορείς να χρησιμοποήσεις την έτοιμη μέθοδο getSelectedIndex()

Δημοσ.

Έτσι το έχω κάνει, αλλά δε με βολεύει. Διότι στην βάση δεδομένων οι τιμές με τα ονόματα έχουν και διπλές εγγραφές, ενώ εκείνες με τις τιμές των id είναι πρωτεύοντα κλειδιά. Και θέλω να μου επιστρέφονται τα πρωτεύοντα κλειδιά. Σ' ευχαριστώ για την απάντηση όμως.

Δημοσ.

Τότε αντιστοίχισε αυτά που σου επιστρέφονται με αυτές που θές :/ Από ότι καταλαβαίνω το frontend σου εχει μόνο τις μέρες, σωστά;

Δημοσ.

Λοιπόν, για να σου δώσω να καταλάβεις καλύτερα. Δεν ξέρω ποιες είναι οι γνώσεις σου στην HTML, αλλά σε HTML εάν φτιάξει ένα dropDownMenu το οποίο είναι ίδιο με το comboBox στην java, εκεί βάζεις το πιο κάτω:

 

><option value="35">Μάκης</option>

 

Σου εμφανίζει δηλαδή το "Μάκης", αλλά όταν το επιλέγεις σου επιστρέφει το value δηλαδή την τιμή 35 στο αναφερόμενο παράδειγμα. Αυτό ακριβώς θέλω να κάνω και στην java.

Δημοσ.
Νομίζω, αν δεν κάνω λάθος, ότι το JComboBox αντιστοιχίζει τις τιμές σε έναν αριθμό.

 

O αριθμός που το αντιστοιχεί είναι το index, οπότε δεν μας κάνει.

 

Η καλύτερη λύση (ίσως και η μοναδική) είναι αυτή που σου είπε ο ippo00.

 

Οπότε αυτό που μπορείς να κάνεις είναι να φτιάξεις ένα Map<String,Integer> και να αντιστοιχήσεις τις τιμές στο combo box με το primary key που θέλεις.

Δημοσ.

Παιδία, ευχαριστώ όλους για τις απαντήσεις σας και το ενδιαφέρον. Θα μπορούσε κάποιος να μου δείξει ένα μικρό παράδειγμα για να καταλάβω καλύτερα αυτό που λέτε; Δεν έχω μεγάλη εμπειρία στη java τώρα την μαθαίνω.

Δηλαδή, εάν κατάλαβα καλά, μου λέτε να φτιάξω το combοBox με τις τιμές που θέλω να βγάζω και να το κάνω mapping να δείχνει τις τιμές που θέλω να δείχνει; Κάτι τέτοιο; Και εάν κατάλαβα σωστά… πώς γίνεται αυτό;

 

 

-----Προστέθηκε 28/11/2008 στις 05 : 58 : 07-----

 

 

Λοιπόν, με την βοήθειά σας και με λίγο ψάξιμο από εδώ και από εκεί έκανα το comboBox έτσι όπως το ήθελα.

 

>private JFrame jFrame1;
private JComboBox testComboBox;

final Map<String, Number> map = getMap();



private TestingComboBox() {
	testComboBox = new JComboBox();
	Set<String> keys = map.keySet();
	Iterator<String> it = keys.iterator();
	while (it.hasNext()){
		String key = it.next();
		testComboBox.addItem(key);
	}
	jFrame1.add(testComboBox);
	

}

private HashMap<String, Number> getMap() {
	CategoriesDAO categoriesDAO = DAOFactory.getCategoriesDAO();
	Collection<Category> category = categoriesDAO.getListOfCategories();
	HashMap<String, Number> map = new HashMap<String, Number>();
	for (Iterator<Category> iterator = category.iterator(); iterator.hasNext(){
		Category category = iterator.next();
		String key = category.getCategoryName();
		Number value = category.getIdOfCategory();
		map.put(key, value);
	}
	return map;
}

 

Και την τιμή που θέλω την παίρνω με το πιο κάτω.

>
String key = (String) testComboBox.getSelectedItem();
Number id = map.get(key);
System.out.println(id);

 

Νέο πρόβλημα τώρα. Τα δεδομένα στο comboBox δε μου βγαίνουν με αλφαβητική σειρά κατά όνομα κατηγορίας, που έχω ορίσει στο query. Γιατί; Που έχω κάνει λάθος;

Δημοσ.

Από την στιγμή που έχεις βάλει τα δεδομένα μέσα σε ένα hash map τότε ότι σειρά είχαν έχει χαθεί.

Το μυστικό σε αυτά τα πράγματα είναι να καταλαβαίνεις πραγματικά τι κάνεις. Στην συγκεκριμένη περίπτωση επέλεξες λάθος τύπο map για να χρησιμοποιήσεις.

 

Για να καταλάβεις τι κάνει το Hash Map. Κάθε αντικείμενο κληρονομεί από την τάξη Object μία συνάρτηση που λέγεται hashCode(). Θεωρητικά το κάθε αντικείμενο έχει μία μοναδική τιμή πρακτικά όμως όχι.

Αυτό που κάνει το hash map είναι να κρατάει μία λίστα από LinkedList. Όταν του βάζεις ένα δεδομένο τότε υπολογίζει την hash value, την μετατρέπει σε ένα νούμερο που να είναι ανάλογο του μεγέθους του table που έχει και τότε πάει στην LinkedList στην θέση Χ της τιμής που υπολόγισε και βάζει το δεδομένο.

Όπως αντιλαμβάνεσαι τα δεδομένα όταν μπούνε στο HashMap έχουν πλέον ανακατωθεί.

Για καλύτερη εξήγηση από την δική μου τότε ρίξε μία ματιά στο java doc:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/HashMap.html

 

Κατά συνέπεια, είναι καλύτερα να κάνεις το query, να βάζεις τις τιμές όπως τις έχεις λάβει στο JComboBox και μετά να τα πετάς στον HashMap.

 

Εναλλακτικά μπορείς να χρησιμοποιήσεις TreeMap που όπως και να πετάξεις τα δεδομένα αυτό θα τα ταξινομήσει. Πρόσεξε ότι όποιο αντικείμενο βάζεις την TreeMap τότε πρέπει να κάνει implement το Comparable interface.

 

Ελπίζω να ήμουν κατανοητός.

Δημοσ.

Αρχικά θα δημιουργήσεις μια κλάση την οποία μπορείς να ονομάσεις Day.

 

>
public class Day {
   private int id;
   private String day = null;
   
   public Day(int id, String day) {
       this.id = id;
       this.day = day;
   }
   
   public int getId() {
       return id;
   }
   
   public String getDay() {
       return day;
   }
   
   public String toString() {
       return day;
   }

}

Μετά δημιουργείς έναν πίνακα από Day objects (τύπου Object που δέχεται ο constructor του JComboBox) ως εξής:

 

>
Object[] days = new Object[] {new Day(10,"Monday"), new Day(22,"Tuesday"), new Day(333,"Wednesday")};

Μετά δημιουργείς το αντικείμενο JComboBox και περνάς στον constructor το array days.

 

>
JComboBox daysCombo = JComboBox(days);

Εναλλακτικά μπορείς πρώτα να δημιουργήσεις το αντικείμενο JComboBox με τον default constructor και μετά να προσθέσεις ένα ένα τα αντικείμενα. πχ:

 

>
JComboBox daysCombo = JComboBox();

daysCombo.addItem(new Day(10,"Monday"));
daysCombo.addItem(new Day(22,"Tuesday"));
daysCombo.addItem(new Day(333,"Wednesday"));

Η πρώτη παράμετρος του constructor της κλάσης Day είναι το id από την βάση δεδομένων και η δεύτερη το String που θα εμφανιστεί στο JComboBox (μπορείς φυσικά να προσθέσεις όσα πεδία θέλεις).

 

Οπότε το JComboBox θα εμφανίσει στο GUI αυτό που θα επιστρέψει η μέθοδος toString() της κλάσης Day για κάθε αντικείμενο.

 

Μετά για να πάρεις το id του αντικειμένου που έχει επιλέξει ο χρήστης γράφεις:

 

>int databaseId = ((Day) daysCombo.getSelectedItem()).getId();

ή

>String day = ((Day) daysCombo.getSelectedItem()).getDay();

για να πάρεις την ημέρα σε String.

 

Δεν χρειάζεται να γίνει χρήση Map ή κάποιου άλλου data structure, απλά κάνεις wrap το String που θέλεις να εμφανίζετε στο combo box σε ένα αντικείμενο μαζί με όποιες επιπλέον πληροφορίες (fields) χρειάζεσαι και κάνεις addItem το συγκεκριμένο αντικείμενο (και όχι το String όπως έκανες) στο JComboBox (ή αλλιώς με την χρήση του constructor όπως στο παραπάνω παράδειγμα). Το JComboBox φροντίζει να κάνει render το String που επιστρέφετε από την μέθοδο toString() (Το field day στην συγκεκριμένη περίπτωση).

 

Ελπίζω να βοήθησα

Δημοσ.

Παιδία, ευχαριστώ όλους για τις απαντήσεις σας, κάθομαι να τις μελετήσω και θα σας ενημερώσω για το τι κατάφερα και τι όχι. Και πάλι ευχαριστώ.

 

 

-----Προστέθηκε 29/11/2008 στις 05 : 43 : 56-----

 

 

Λοιπόν παιδιά, δοκίμασα και μελέτησα όλες τις προτάσεις και κατέληξα σε αυτή του DiAvOl. Μου είναι πιο απλή, πρακτική και πλησιάζει πολύ σε αυτό που ήθελα εξ αρχής. Εκτός τούτων, προσαρμόζεται πολύ πιο εύκολα στο ήδη υπάρχον κώδικα.

Ωστόσο και η λύση με το map μ' άρεσε, αλλά τα έκανα θάλασσα εκεί με το has map. Διάβασα αυτά που μου έγραψε ο alex2005, διάβασα και το java doc που μου πρότεινε, αλλά έχω μία σύγχυση λίγο με το όλο θέμα. Ας τελειώσω με αυτό που φτιάχνω και θα το κοιτάξω κάποια άλλη στιγμή γιατί φαίνεται πολύ ενδιαφέρον.

Και πάλι ευχαριστώ όλους όσους ανταποκρίθηκαν στο post μου.

Δημοσ.

Χρησιμοποιώντας την μέθοδο του DiAvOl πώς πρέπει να ορίσω το:

 

>daysCombo.setSelectedItem(??????);

 

 

Τι βάζω για να προεπιλέξω μία επιλογή;

Δημοσ.

To αντικείμενο που θέλεις να είναι προεπιλεγμένο.

 

π.χ στο παράδειγμα του Diavol, αν χρησιμοποιήσεις την λύση με τον πίνακα τότε μπορείς να κάνεις:

 

>
daysCombo.setSelectedItem(days[X]);

Δημοσ.
To αντικείμενο που θέλεις να είναι προεπιλεγμένο.

 

π.χ στο παράδειγμα του Diavol, αν χρησιμοποιήσεις την λύση με τον πίνακα τότε μπορείς να κάνεις:

 

>
daysCombo.setSelectedItem(days[X]);

 

Λοιπόν, το days θα πρέπει να είναι η class που έχω προσθέσει στο combo για model, το X τι θα είναι;

 

 

-----Προστέθηκε 30/11/2008 στις 04 : 49 : 54-----

 

 

Λοιπόν, εγώ φορτώνω τα δεδομένα μέσα στο comboBox μου, με τον παρακάτω τρόπο.

>	CategoryDAO categoryDAO = DAOFactory.getCategoryDAO();
Collection<Category> categories = categoryDAO.getListOfCategories();
for (Iterator<Category> iterator = categories.iterator(); iterator.hasNext() {
	Category category = (Category) iterator.next();
	jCmbDipCategory.addItem(new ComboData(category.getId(), category.getCategory()));
}

 

Όπου, έχω κατασκευάσει ένα comboBox (jCmbDipCategory) και του βάζω τα δεδομένα τα οποία τα παίρνω από μία βάση δεδομένων mysql.

Το for πρέπει να το χρησιμοποιήσω για να φορτώσω τα δεδομένα μέσα στο combo. Μετά, έχω κατασκευάσει και μία class: ComboData όπως είναι η Day στο παράδειγμα του

DiAvOl.

Το πρόβλημά μου είναι, πώς μπορώ να προεπιλέξω κάτι συγκεκριμένο στο combobox;

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...