Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich sitze zur Zeit an einem Problem, wie JComboBoxen erneuert werden.
Nehmen wir an in der 1. ComboBox soll ein Buch ausgewählt werden.
Dann soll in der 2. ComboBox ein Kapitel ausgewählt werden, welches aber nur in diesem einen Buch ist.
In der 3. ComboBox soll widerum ein Absatz ausgewählt werden, der aber nur in dem einen Kapitel vorkommt.
Wie ist das realisierbar? Auch dass er nach Neuauswahl des Buches, die anderen ComboBoxen auch erneuert.
Einen Codeansatz zu posten bringt wenig, da der völlig nach hinten los ging :/
Ein , und auch der leichtere Weg wäre einfach das Model neu einzulesen, welches die Daten hält.
sprich , je nach Auswahl der ersten Combobox, setzt du das Model der 2ten Combobox, und eben nach je nach Auswahl der 2ten , das Model der 3ten .
Das hier ist extrem simpel aufgebaut und auch nicht innovativ, aber als beispiel denke ich es erfüllt seinen Zweck :
Im Normalfall schriebst du dir eigene Modelle die du dann einmal setzt, und einfach je nach auswählt der jeweiligen ComboBox, setzt oder eben "tauscht".
Hier wäre auch einen Datenstruktur denkbar , welche alle verschiedenen Modelle zu dem jeweiligen Buch / Objekt beinhaltet ( z.B eine ArrayList oder eine HashMap )
Wie gesagt das hab ich jetzt nur auf die schnell zusammengezimmert, auch ein Observer pattern wäre hier denkbar welches die jeweiligen ComboBoxen überwacht und dementsprechend an einem Controller Aktionen auslöst.......
Java:
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Example extends JPanel implements ItemListener{
String[] b1 = {"","Buch 1","Buch 2","Buch 3"};
String[] b2 = {"","Abschnitt 1","Abschnitt 2","Abschnitt 3"};
String[] b3 = {"","Teil 1","Teil 2","Teil 3"};
JLabel content;
JComboBox<String> box1;
JComboBox<String> box2;
JComboBox<String> box3;
DefaultComboBoxModel<String> model1;
DefaultComboBoxModel<String> model2;
DefaultComboBoxModel<String> model3;
public Example(){
setPreferredSize(new Dimension(500,250));
init();
}
private void init(){
model1 = new DefaultComboBoxModel<>(b1);
model2 = new DefaultComboBoxModel<>(b2);
model3 = new DefaultComboBoxModel<>(b3);
box1 = new JComboBox<>(model1);
box2 = new JComboBox<>();
box3 = new JComboBox<>();
box1.addItemListener(this);
box2.addItemListener(this);
box3.addItemListener(this);
content = new JLabel();
add(box1);
add(box2);
add(box3);
add(content);
}
public static void main(String[] args){
JFrame f = new JFrame();
f.setContentPane(new Example());
f.setDefaultCloseOperation(2);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
@Override
public void itemStateChanged(ItemEvent e){
if(e.getItem() == box1.getItemAt(1)) {
box2.setModel(model2);
}
if(e.getItem() == box2.getItemAt(1)) {
box3.setModel(model3);
}
if(e.getItem() == box3.getItemAt(1)) {
content.setText("Da haben Sie aber was tolles ausgewählt !");
}
}
}
Wenn ich einen Itemlistener für alle 3 Boxen nutze, wie kann ich dann überprüfen, welche ComboBox nun verändert wurde? Und welches nun ausgewählt ist funktioniert via .getItem() oder?
wie gesagt du prüfst erst ob ein Event ausgelöst worden ist, dann prüfst du welche art von Event, dann welche box es ausgelöst hat und dann kannst du dir das item per getItem() geben lasse, was du dann damit machst bleibt ja ganz dir überlassen.
bedenke aber das wenn du mit ItemEvent.SELECTED / DESELECTED arbeitest, du aufpassen musst da sonst immer beim auswählen eines anderen Items das nichtmehr selektierte auch in betracht gezogen werden würde.
also kannst du den status auch leer implementieren , ausser du möchtest mit den nichtmehr selektierten Items irgend etwas machen .
Java:
import java.awt.Dimension;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Example extends JPanel implements ItemListener{
JComboBox<String> box, box1;
DefaultComboBoxModel<String> model, model1;
public Example(){
setPreferredSize(new Dimension(250,150));
box = new JComboBox<>();
box.addItemListener(this); // <<--- Listener setzen
box1 = new JComboBox<>();
box1.addItemListener(this); // <<--- Listener für 2te box setzen.
model = (DefaultComboBoxModel<String>) box.getModel();
model1 = (DefaultComboBoxModel<String>) box1.getModel();
model.addElement("Ich bin ein Buch !");
model.addElement("Ich bin ein anderes Buch !");
model1.addElement("Ich bin ein weiteres Buch !");
model1.addElement("Und noch eins !");
add(box);
add(box1);
}
@Override
public void itemStateChanged(ItemEvent e){
if(e.getStateChange() == ItemEvent.DESELECTED) {
// leer da sonst immer das deselektierte Item auch ausgegeben wird.
}
// bei statuswechsel auf selektion eines Items reagieren
if(e.getStateChange() == ItemEvent.SELECTED) {
/* prüfen welche box das event ausgelöst hat und dementsprechend
* das item auf der konsole ausgeben lassen welches
* zzt. ausgewählt ist.
*/
if(e.getSource() == box) {
System.out.println(e.getItem());
}
if(e.getSource() == box1) {
System.out.println(e.getItem());
}
}
}
public static void main(String[] args){
JFrame f = new JFrame();
f.setContentPane(new Example());
f.pack();
f.setDefaultCloseOperation(2);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}