Swing JComboBox mit Listener aktualisieren

Sherry

Aktives Mitglied
Hallo zusammen,

mit folgenden Programm erzeuge ich eine JComboBox, die Städtenamen aus einer XML-Datei erhält. Die Städteliste wir über die Klasse XMLCreator und deren Methode CityList() erzeugt.
Ich habe es soeit geschafft, dass in dem Dropdown-Menü alle Städte aus der XML-Datei angezeigt werden.

Mein Ziel geht noch weiter. Und zwar soll die XML-Datei während der laufzeit dieses Programmes geändert werden, zum Beispiel neue Städte hinzu gefügt oder entfernt werden. Und das ComboboxModel sollte während der Laufzeit beim Herunterklappen des Dropdown-Menüs die Werte aktuallisieren.

Mit welchem Listener kann das realsiert werden?

Viele Grüße

Sherry

Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

import java.awt.Window.Type;
import java.util.Vector;

import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;

import XMLCreator;

public class ComboBoxTest extends JFrame implements ListDataListener {

	private JPanel contentPane;
	private JComboBox dropDown;
	private DefaultComboBoxModel comboBoxModel1;
	

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					ComboBoxTest frame = new ComboBoxTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public ComboBoxTest() {
		setType(Type.UTILITY);
		setTitle("Test für JComboBox");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		
		dropDown = new JComboBox();
		/*
		 * Städte in Liste einlesen
		 */
		Vector<String> cities = new Vector<String>();
		XMLCreator cityList = new XMLCreator();
		for (int i = 0; i < cityList.CityList().size(); i++) {
			cities.add(cityList.CityList().get(i));
		}
		
		/*
		 * ComboBoxModel erzeugen
		 */
		comboBoxModel1 = new DefaultComboBoxModel<String>(cities);
		comboBoxModel1.addListDataListener(this);
		
		/*
		 * ComboBoxModel setzen
		 */
		dropDown.setModel(comboBoxModel1);
		
		GroupLayout gl_contentPane = new GroupLayout(contentPane);
		gl_contentPane.setHorizontalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGap(76)
					.addComponent(dropDown, GroupLayout.PREFERRED_SIZE, 223, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(137, Short.MAX_VALUE))
		);
		gl_contentPane.setVerticalGroup(
			gl_contentPane.createParallelGroup(Alignment.LEADING)
				.addGroup(gl_contentPane.createSequentialGroup()
					.addGap(101)
					.addComponent(dropDown, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addContainerGap(137, Short.MAX_VALUE))
		);
		contentPane.setLayout(gl_contentPane);
	}

	@Override
	public void contentsChanged(ListDataEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void intervalAdded(ListDataEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void intervalRemoved(ListDataEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
 

turtle

Top Contributor
Und zwar soll die XML-Datei während der laufzeit dieses Programmes geändert werden
Die Daten, die in einer Combobox angezeigt werden, sind in einem ComboBoxModel gespeichert.

Also musst du das Model neu "laden", indem du die Daten aus der XML-Datei wieder einliest. Über jComboBox.setModel(...) kannst du dann deiner ComboBox mitteilen, das es neue Model-Daten gibt.

Unter java-7 gibt es mit WatchService die Möglichkeit, informiert zu werden, wenn sich eine Datei geändert hat.
 

Harry Kane

Top Contributor
Warum willst du prophylaktisch bei jedem Öffnen der JComboBox prüfen, ob sich der Umfang der anzuzeigenden Daten geändert hat? Klingt für mich seeeehr fragil.
Andersrum wird ein Schuh draus: lege dir ein ListModel an welches AbstractListModel erweitert. Dieses nennen wir es mal XMLContentListModel überprüft in regelmässigen Abständen einen Abschnitt einer Datei auf Änderungen. Wenn Änderungen festgestellt werden, werden die Daten im ListModel durch Einlesen/Neuparsen des Abschnitts aktualisiert. Anschliessend rufst du in deinem Model fireContentsChanged auf.
 

Sherry

Aktives Mitglied
Warum willst du prophylaktisch bei jedem Öffnen der JComboBox prüfen, ob sich der Umfang der anzuzeigenden Daten geändert hat? Klingt für mich seeeehr fragil.

Was meinst Du mit fragil? Sinn und Zweck des Überprüfens ist, das Hauptfenster benötigt diese Auswahlliste. Wenn jetzt der Anwender feststellt, die gewünschte Stadt ist noch nicht eingepflegt, dann soll er es mit einem AddFrame einpflegen können. Nach Schliessen dieses Frames steckt die Stadt in der XML-Datei, aber noch nicht in der JComboBox. Das Programm müsste neugestartet werden.

Was wäre denn der Unterschied zu Deinem Vorschlag mit einem ListModel und meiner Lösung? Meine parst doch die XML-Datei ebenfalls. Und die XML-Datei müsste doch in beiden Fällen komplett geparst werden, sonst werden die Änderungen nicht erfasst.
 

turtle

Top Contributor
Daher würde ich die Daten in einer Datenbank halten;) (Aber mich fragt ja keiner;()

Das Laden/Parsen ist aus meiner Sicht unnötig und kostet "nur" Performance.
 
Zuletzt bearbeitet:

Sherry

Aktives Mitglied
Okay, jetzt sind wir ganz von dem abgewichen, was ich wissen wollte.
Wie heißt der Listener bei der JComboBox, der das kann was ich erzielen will?
Ob Datenbank oder XML-Datei spielt an diesem Punkt keine Rolle, auch wäre meine Frage dieselbe.
 

turtle

Top Contributor
Du hast Recht:D

Aber ich finde, Harry Kane und ich haben es bereits beantwortet. Wir finden, du solltest ein eigenes Model schreiben, welches die XML Datei parsed und die Einträge verwaltet.

Ob du das ganze Model tauschen musst oder über eine fireXXX-Methode dies triggern kannst, richtet sich auch danach welche Änderungen im Model gemacht werden.

Meines Wissens gibt es keinen Listener, der das, was du beabsichtigst, ermöglicht.

Du kannst BasicComboBoxUI extenden und createPopup() überschreiben. Ist aber abhängig vom Look-and-Feel und ich schätze das als nicht trivial ein. Ich habs noch nicht gemacht:oops:
 

turtle

Top Contributor
Vielleicht hilft folgendes Mini-Beispiel weiter?

Java:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyComboBox extends JPanel {
    private MyDefaultComboBoxModel myModel;
    private JComboBox<String> myCombobox;

    public MyComboBox(JFrame frame) {
	myModel = new MyDefaultComboBoxModel();
	myCombobox = new JComboBox<String>();
	myCombobox.setMaximumRowCount(10);
	myModel.reload();
	myCombobox.setModel(myModel);
	JButton load = new JButton("Reload");
	load.addActionListener(new ActionListener() {

	    @Override
	    public void actionPerformed(ActionEvent e) {
		myModel.reload();
		myCombobox.setModel(myModel);
	    }
	});
	frame.add(myCombobox);
	frame.add(load);
    }

    public static void main(String[] args) {
	JFrame frame = new JFrame("Test Combobox");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.setLayout(new FlowLayout());
	frame.add(new MyComboBox(frame));
	frame.pack();
	frame.setVisible(true);
    }

}

class MyDefaultComboBoxModel extends DefaultComboBoxModel<String> {
    private static Random random = new Random();

    public void reload() {
	removeAllElements();
	for (int i = 0; i < 10; i++) {
	    int nextInt = random.nextInt(20);
	    addElement("" + nextInt);
	}
    }
}
 

Harry Kane

Top Contributor
Wenn du es unbedingt mit einem Listener versuchen möchtest:
Nimm einen PopupMenuListener und implementiere popupMenuWillBecomeVisible(PopupMenuEvent pme).
Mit "fragil" meine ich, daß du in dem Moment, in dem die JList eingeblendet wird, noch schnell die Liste aktualisierst oder der JComboBox gar ein neues Modell verpasst. Je nachdem was da wie zu welcher Millisekunde aktualisiert wird, wäre mit die Gefahr zu hoch, daß es dabei zu Artefakten bei der Darstellung kommt oder gar eine Exception fliegt, je nachdem ob alles im EDT abläuft oder irgendein Aktualisierungsvorgang doch nebenläufig programmiert ist. Alles in allem wäre mir das viel zu heikel. Je nachdem wie lang die Überprüfung ist, müsstest du ausserdem mit einem Zeitverzug rechnen zwischen Klick auf den entsprechenden JComboBox Button und dem Moment wo das Popup wirklich erscheint.
 

Sherry

Aktives Mitglied
Ich denke schon. Denn alternativ hatte ich jetzt auch daran gedacht einen "Auffrisch"-Button, oder wie Du es als Reload bezeichnest, einzusetzen und dort das Model neuzusetzen.

Du merkst, ich bin noch am Lernen.

Da ich aus dem Hauptfenster mittels "Hinzufügen" ein Unterfenster zum Hinzufügen starten kann und eigentlich nur nach dem Beenden im Hauptfenster die Liste aufgefrischt werden braucht, dachte ich daran, den Aufruf dazu ins Unterfester zu legen.
Also wenn ich auf Beenden im Unterfenster klicke, müsste das Model im Hauptfenster neugesetzt werden.

Kann ich so etwas fensterübergreifend realisieren? Also der ActionListener im Unterfenster des Beenden-Buttons ruft setModel() im anderen Fenster auf. Etwa so ähnlich:

Java:
JButton closeButton = new JButton("Beenden");
		closeButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
                             targetCityComboBox.setModel(comboBoxModel);
			}
		});
 

turtle

Top Contributor
Also der ActionListener im Unterfenster des Beenden-Buttons ruft setModel() im anderen Fenster auf
Klar geht das:)

Ich habe das in meinem Mini-Programm NICHT im Reload gemacht, da ich der Meinung bin, das dies nicht Aufgabe vom Reload ist. (Sollte nur das Model neu bauen).

Daher wird dieses ausserhalb gemacht durch myCombobox.setModel(myModel) unter der Annahme, das neue Daten ins Model gepumpt wurden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JComboBox Listener AWT, Swing, JavaFX & SWT 2
B Probleme bei der dynamischen JCombobox-Einträge und Listener AWT, Swing, JavaFX & SWT 2
M An eine JComboBox einen Listener binden? AWT, Swing, JavaFX & SWT 3
K listener für jcombobox AWT, Swing, JavaFX & SWT 4
hannibalstgt Fehler bei JCOMBOBOX GUI Anzeige AWT, Swing, JavaFX & SWT 4
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
R JComboBox abfragen AWT, Swing, JavaFX & SWT 1
Esquid If Befehl bei JComboBox AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
D JComboBox Strings aus JTextFields zuordnen AWT, Swing, JavaFX & SWT 2
F JComboBox und Model AWT, Swing, JavaFX & SWT 10
I Editierbare JComboBox, die nur Ganzzahlen als Eingabewerte zulässt AWT, Swing, JavaFX & SWT 3
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
Hatsi09 JCombobox default wert AWT, Swing, JavaFX & SWT 6
D Swing JCombobox Aktion löscht Grafik AWT, Swing, JavaFX & SWT 1
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
R Swing Java9 NullPointerException bei JComboBox AWT, Swing, JavaFX & SWT 13
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
D Swing JCombobox Weiße Leerzeilen AWT, Swing, JavaFX & SWT 10
G JComboBox: Arrow-Button permanent anzeigen AWT, Swing, JavaFX & SWT 4
D Swing Java JComboBox Example AWT, Swing, JavaFX & SWT 16
K Swing JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 4
D Swing "blaues" Element aus JComboBox erhalten AWT, Swing, JavaFX & SWT 6
F JComboBox und Einträge AWT, Swing, JavaFX & SWT 3
gamillton Swing JComboBox mit extra Inhalt + breiteres Popupmenü AWT, Swing, JavaFX & SWT 0
T JPanelsteuerung mit JComboBox AWT, Swing, JavaFX & SWT 5
N Swing Duplikate im Jcombobox vermeiden AWT, Swing, JavaFX & SWT 15
L Swing JComboBox kann nicht erstellt werden! AWT, Swing, JavaFX & SWT 2
C JComboBox Objecte übergeben und Eintrag auswählen AWT, Swing, JavaFX & SWT 3
M Swing JComboBox mit Laufwerksbuchstaben (Windows) AWT, Swing, JavaFX & SWT 6
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
D Swing JComboBox (DefaultComboBoxModel) überschreibt Eintrag beim erstellen AWT, Swing, JavaFX & SWT 0
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
3 JComboBox - Action - Auslesen & Umwandeln AWT, Swing, JavaFX & SWT 9
M Alle Schriftarten in JComboBox AWT, Swing, JavaFX & SWT 5
M Swing JComboBox eigenes Design AWT, Swing, JavaFX & SWT 3
Sin137 JComboBox mit Generics AWT, Swing, JavaFX & SWT 14
R JComboBox erweitern AWT, Swing, JavaFX & SWT 5
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
V Editierbare JComboBox AWT, Swing, JavaFX & SWT 2
D Swing JCombobox in einem JTable vorbelegen AWT, Swing, JavaFX & SWT 4
F neuen Menüpunkt in jcombobox einfügen AWT, Swing, JavaFX & SWT 1
F Swing Jcombobox mit manueller Rückgabe AWT, Swing, JavaFX & SWT 4
W JComboBox auffristen nach Listenänderung AWT, Swing, JavaFX & SWT 20
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
J JComboBox + ItemListener AWT, Swing, JavaFX & SWT 12
T Swing jComboBox auslesen mit Datenbankanbindung AWT, Swing, JavaFX & SWT 3
S JComboBox aus anderer Klasse füllen (Java-Swing) AWT, Swing, JavaFX & SWT 0
D Swing Erstes Item einer JCombobox in JTable anzeigen AWT, Swing, JavaFX & SWT 2
N JComboBox in JTable [Swing] -> totaler UI-Einsteiger AWT, Swing, JavaFX & SWT 3
H Swing jComboBox Ausgabe -1/null AWT, Swing, JavaFX & SWT 4
C Arrow Farbe bei JComboBox AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
O JTextfield und JComboBox Wert in SQL Database speichern AWT, Swing, JavaFX & SWT 4
S JComboBox UTF-8 Codierung zuweisen AWT, Swing, JavaFX & SWT 5
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
S JComboBox nach auswahl erneuern AWT, Swing, JavaFX & SWT 4
A Swing per JComboBox gewünschtes Attribut auswählen und Komponenten passen sich an AWT, Swing, JavaFX & SWT 7
I JComboBox gibt bei ausgewählten ITem NullPointer an... AWT, Swing, JavaFX & SWT 3
D Swing JCombobox - Tooltip Location ändern AWT, Swing, JavaFX & SWT 4
J JComboBox Dropdown Icon AWT, Swing, JavaFX & SWT 2
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
A Swing bei Auswahl und klick eines JComboBox buttons die Klasse eines anderen Projekts aufrufen AWT, Swing, JavaFX & SWT 3
F Swing jComboBox auslesen AWT, Swing, JavaFX & SWT 6
O Swing TableCellRenderer und JComboBox AWT, Swing, JavaFX & SWT 4
F Swing JComboBox - Frage zur Größe AWT, Swing, JavaFX & SWT 11
C Swing JComboBox, ItemListener gibt 2x aus AWT, Swing, JavaFX & SWT 2
O JComboBox - autom. Selektieren AWT, Swing, JavaFX & SWT 6
J JComboBox - wie getSelectedItem() überschreiben? AWT, Swing, JavaFX & SWT 8
S Swing Jcombobox und array AWT, Swing, JavaFX & SWT 6
D Swing JComboBox aktualisieren AWT, Swing, JavaFX & SWT 4
E JComboBox AWT, Swing, JavaFX & SWT 8
N Swing JComboBox Frage AWT, Swing, JavaFX & SWT 5
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
H Swing Element aus JComboBox auswählen AWT, Swing, JavaFX & SWT 2
H JCombobox inhalt löschen AWT, Swing, JavaFX & SWT 17
N Swing JCombobox - PopupMenu-Inhalt mit KSKB AWT, Swing, JavaFX & SWT 2
O JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
S Swing JComboBox mit Datenbank füllen AWT, Swing, JavaFX & SWT 16
S Inhalt einer JComboBox aktualisieren AWT, Swing, JavaFX & SWT 6
F Swing JComboBox in JTable AutoComplete + Tab AWT, Swing, JavaFX & SWT 4
O JComboBox getSelectedItem AWT, Swing, JavaFX & SWT 4
M JComboBox Hintergrundfarbe des gewählten Items AWT, Swing, JavaFX & SWT 3
B Swing Problem: Horizontaler Scrollbalken in JComboBox hinzufügen AWT, Swing, JavaFX & SWT 4
M JCombobox mit ID und Text AWT, Swing, JavaFX & SWT 4
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
C Swing Dynamische JComboBox (Filter) AWT, Swing, JavaFX & SWT 28
M JComboBox Item-Auswahl in JTable AWT, Swing, JavaFX & SWT 2
L Jbutton + jcombobox mit vorhandenen frame verknüfen AWT, Swing, JavaFX & SWT 8
D JCombobox mit Linien Styles AWT, Swing, JavaFX & SWT 4
H Unterschiedliche JComboBox je JTable Zeile AWT, Swing, JavaFX & SWT 4
B jCombobox addItem funktioniert nicht AWT, Swing, JavaFX & SWT 9
G JComboBox mit CellRenderer (Auswahl) AWT, Swing, JavaFX & SWT 11
G Swing JComboBox anpassen AWT, Swing, JavaFX & SWT 6
M Item in JComboBox umbenennen AWT, Swing, JavaFX & SWT 5
M Swing Busy Waiting Problem (JComboBox) AWT, Swing, JavaFX & SWT 11
C JComboBox Renderer Problem AWT, Swing, JavaFX & SWT 7
N Renderer Editoren und die JCombobox AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben