Swing ActionListener für JComboBox

Status
Nicht offen für weitere Antworten.

Dolce

Mitglied
Hallo Jungs,

ne kleine Frage!

Ich möchte, sobald ich auf den "Pfeil" zum Dropdown Menü für die JComboBox klicke eine Abfrage zur Datenbank starten!

kurzes Beispiel!
Sobald ich auf den Pfeil klicke, soll er mir alle Daten einer bestimmten Tabelle
in der Combobox anzeigen!

Aber wie heißt der ActionListener der diesen "Pfeil" überwacht!

Wäre euch super dankbar...!

Gruß
Thomas
 

Ebenius

Top Contributor
Das macht man am besten gar nicht per Listeners. Implementier ein eigenes ComboBoxModel was die Abfrage zur Datenbank macht. Am besten sollte das Modell in etwa so aussehen:
Java:
import java.awt.BorderLayout;
import java.util.List;

import javax.swing.*;

public class MyDBComboBoxModel extends DefaultComboBoxModel {

  private boolean initialized;
  private boolean initializing;

  @Override
  public Object getElementAt(int index) {
    ensureInitialized();
    return super.getElementAt(index);
  }

  @Override
  public int getSize() {
    ensureInitialized();
    return super.getSize();
  }

  protected void ensureInitialized() {
    if (!initialized && !initializing) {
      initializing = true;

      new SwingWorker<Object, Object>() {

        @Override
        protected Object doInBackground() throws Exception {
          for (int i = 0; i < 26; i++) {
            publish(new Character((char) ('A' + i)));
            Thread.sleep((long) (Math.random() * 500));
          }
          return null;
        }

        @Override
        protected void process(List<Object> chunks) {
          for (Object element : chunks) {
            addElement(element);
          }
        }

        @Override
        protected void done() {
          initialized = true;
        }
      }.execute();
    }
  }
}
Zeilen 30 bis 34 musst Du mit Deiner DB-Abfrage bestücken und publish(...) entsprechend aufrufen. Der Test läuft aber erstmal so und simuliert einen entsprechend langsamen Zugriff. Tut er was Du möchtest? Ausführen kannst Du das Modell mit diesem Test:
Java:
public static void main(String[] args) {
  final MyDBComboBoxModel model = new MyDBComboBoxModel();
  model.setSelectedItem("G");
  final JComboBox comboBox = new JComboBox(model);
  comboBox.setPrototypeDisplayValue("wwwwwwwwwwwwwww");

  final JPanel contentPane = new JPanel(new BorderLayout(6, 6));
  contentPane.add(comboBox);

  final JFrame f = new JFrame("Test Frame: MyDBComboBoxModel");
  f.setContentPane(contentPane);
  f.pack();
  f.setLocationRelativeTo(null);
  f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  f.setVisible(true);
}
Ebenius
 

Dolce

Mitglied
O.k., danke dir erstmal...,
ich werde mich damit erstmal auseinander setzen müssen...!

Werde ich aber machen...!
Vielen Dank für deinen Tipp...!

Gruß
 

Ebenius

Top Contributor
Wie per PN gewünscht: Hier ein paar Erläuterungen.

Vorab: Kannst Du wirklich die Daten erst laden, wenn der Benutzer auf den Pfeil der JComboBox klickt? Oder könntest Du die Daten schon vorher laden? Wenn Du nur die Daten der JComboBox setzen möchtest, dann geht das viel einfacher. Wenn Du sie wirklich erst zum Zeitpunkt des Aufklappens abholen kannst, dann ist mein Ansatz gut.

Ich bin mir nicht ganz sicher, wie weit ich ausholen muss. Daher erkläre ich etwas weitläufiger.

[SIZE="+1"]Modell einer JComboBox[/SIZE]
Jede nicht triviale Swing-Komponente hat ein Modell. Ein Modell stellt der Komponente eine Schnittstelle zu deren Daten zur Verfügung und benachrichtigt sie über Änderungen an den Daten. Die Komponente selbst kennt ihre Daten nur in Form des Modells. Ein Modell ist auf die Art der Komponente zugeschnitten. Das Modell einer JComboBox ist das ComboBoxModel. Eine JComboBox kann in ihrem Popup die selbe Art Daten darstellen wie eine JList*. Eine bestimmte Anzahl an Zeilen (getSize()). In jeder Zeile ein Element (getElementAt(int)). Das ComboBoxModel basiert daher auf der ListModel-Schnittstelle. Eine JComboBox hat darüber hinaus einen ausgewählten Wert den sie abfragen und verändern kann. Deshalb erweitert die ComboBoxModel-Schnittstelle die ListModel-Schnittstelle um zwei Methoden. Eine Methode getSelectedItem() liefert den ausgewählten Wert, die Methode setSelectedItem(Object) ändert den ausgewählten Wert im Modell. Eine mitgelieferte und fertige Implementation des ComboBoxModels heißt DefaultComboBoxModel.

[SIZE="+1"]Wie funktioniert das MyDBComboBoxModel?[/SIZE]
Die Klasse ist abgeleitet vom DefaultComboBoxModel. Sie überschreibt die beiden oben erwähnten Methoden des zu Grunde liegenden ListModels (geerbt aus AbstractListModel). Die Methoden stellen sicher, dass das Modell initialisiert ist (ensureInitialized()). Danach delegieren sie an die darunter liegende Methodenimplementation.

Wenn der Benutzer auf das Dreieck der JComboBox klickt, wird ein Event erzeugt. Die JComboBox wird dann Ihr Modell befragen, welche Daten sie im Popup anzeigen soll. All das geschieht im Event Dispatch Thread. Dieser Thread arbeitet alle Events nacheinander ab. Er ist für das Zeichnen und alle Benutzereingaben zuständig. Wenn man zeitaufwändige Aktionen im Event Dispatch Thread ausführt, kann er während dessen nichts anderes machen. Datenbankzugriffe sind zeitaufwändige Aktionen. Würde man diese direkt im Modell implementieren, könnte das Popup der JComboBox erst nach dem Empfang aller Daten gezeigt werden. Deshalb müssen solche Aktionen in einen anderen Thread ausgelagert werden.

Die Methode ensureInitialized() prüft, ob sie schon einmal aufgerufen wurde. Wenn das nicht der Fall ist, startet sie einen neuen Thread. Dieser Thread übernimmt die zeitaufwändige Aktion, Daten zu laden. Ich habe anstatt eines einfachen Thread-Objektes die SwingWorker**-Klasse verwendet. Ein SwingWorker startet beim Aufruf der execute()-Methode einen Thread der die Methode doInBackground() ausführt. Diese Methode lädt die Daten und fügt sie dem Modell hinzu. Allerdings muss der Entwickler dafür sorgen, dass alle Änderungen einer Komponente synchron zum Event Dispatch Thread ausgeführt werden...

Aus diesem Grund benutzt man einen SwingWorker und keinen nackeligen Thread. Die doInBackground()-Methode darf nicht selbst addElement(Object) aufrufen. Sonst wären die Änderungen am Modell nicht synchron zum Event Dispatch Thread. Stattdessen ruft doInBackground() die publish(Object...)-Methode des SwingWorkers auf. Diese Methode "merkt" sich alle ihr übergebenen Objekte. Dann sendet Sie einen Event den der Event Dispatch Thread später behandelt. Der Event Dispatch Thread ruft beim Abarbeiten dieses Events die process(List<Object>)-Methode auf und übergibt ihr alle bis dahin angesammelten Daten aus den publish(Object...)-Aufrufen. Da der Event Dispatch Thread die process(List<Object>)-Methode selbst aufruft, kann diese die Änderungen am Modell sicher vornehmen. Die Methode addElement(Object) (aus AbstractListModel geerbt) fügt die zuvor geladenen Daten dem Modell hinzu und benachrichtigt die JComboBox. Die JComboBox aktualisiert daraufhin die Liste des Popups.

Kannst Du mit dieser Erklärung etwas anfangen?

Ebenius
__________
[SIZE="-2"]* Deshalb wird auch intern eine JList innerhalb des Popups benutzt, um die Daten darzustellen.
** Mehr zum SwingWorker im Sun Java™ Tutorial: Concurrency in Swing.[/SIZE]
 

Dolce

Mitglied
Perfekt deine Erklärungen Ebenius...,

muss mich zwar da noch etwas reinarbeiten, aber wirklich genial erklärt...!
Nochmals vielen vielen Dank für deine Bemühungen, du scheinst es echt richtig drauf zuhaben...! :)

Meiner Meinung nach brauch ich die Daten genau dann, wenn ich auf den Pfeil klicke!
Denn das Programm ist ja noch etwas umfangreicher, wenn ich z.B. ein neuen "Verwandten" anlege, hat sich ja die Tabelle um einen Datensatz erweitert!
so, wenn ich mir jetzt aber die Daten schon vorher in ein Array (denk ich das meinst du) lade, hab ich ja nicht die aktualisierten daten vorliegen!
Um deshalb sicher zu gehen, dass ich immer ALLE aktualisierten Daten habe muss ich doch die Datenbankabfrage erst dann machen, wenn ich auf den Pfeil klicke...!

Oder?? Wieder Denkfehler... :)??
 

lackschuh

Mitglied
Hallo
ich hätte auch eine Frage diesbezüglich und zwar bin ich genau so vorgegangen wie oben beschrieben. D.h. ich hab mir ein MyDBComboBoxModel erstellt. Nun habe ich ein paar Frage, da ich totaler Anfänger bin:

Java:
//DB-Abfrage----------------------------------------
    	  
    	  @Override
        protected Object doInBackground() throws Exception {
         
        	for (int i = 0; i < 26; i++) {
            publish(new Character((char) ('a' + i)));
         
          }
          return null;
        }
        
 //-------------------------------------

Wie oben beschrieben, kommt hier die DB Abfrage rein. Wenn ich meine DB Abfragen in der Klasse DBManager habe wie zB:
Java:
public Object readObject(Kunden curKunde) {
		ResultSet ergebnis;

		try {	
			
			ergebnis = SingletonErgebnis.get("kunde");			
			curKunde = new Kunden();
			
			if (ergebnis.next());
			else
			{
				SingletonErgebnis.set();
				ergebnis = SingletonErgebnis.get("kunde");				
			}
			
			Class objectClass = curKunde.getClass();
			java.lang.reflect.Method[] methoden = objectClass.getMethods();
			String spaltenNamen = "";
			String attribute = "";

			for (int i = 0; i < methoden.length; i++) {
				if (methoden[i].getName().contains("set")) {
					String name = methoden[i].getName();
					if (!name.equals("setClass")) {
						Object[] array = new Object[1];
						array[0] = ergebnis.getString(name.substring(3));
						System.out.println("Führe Methode aus auf : "
								+ methoden[i].toString());
						System.out.println("Mit Parameter : "
								+ array[0].toString());

						if (methoden[i].toString().indexOf("eschlecht") > 0)
							if (((String) array[0]).compareTo("0") > 0)
								array[0] = new Boolean(false);
							else
								array[0] = new Boolean(true);

						if (methoden[i].toString().indexOf("atum") > 0) {
							DateFormat df = DateFormat.getDateInstance(
									DateFormat.DEFAULT, Locale.GERMANY);
							try {
								array[0] = df.parse((String) array[0]);
							} catch (ParseException e) {
								e.printStackTrace();
							}
						}
						try {
							methoden[i].invoke(curKunde, array);
						} catch (IllegalArgumentException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (IllegalAccessException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						} catch (InvocationTargetException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return curKunde;
	}
muss ich dann nochmals die Abfrage in die MyDBComboBoxModel einfügen(zB SELECT name FROM kunde) oder kann ich irgendwie von dort in die DBManager verweisen?
Ich hab in der DB einmal Kunden und einmal PKWs. Ich möchte im Dialog PKW mittels JComboBox dem PKW einen Kunden zuweisen. Die JComboBox habe ich bereits im Dialog PKW erstellt.
 
Zuletzt bearbeitet:

DrDementie

Neues Mitglied
Ich habe das ganze über einen Actionlistener gelöst, häng aber an einem Folgeproblem, trotzdem sollte das dein Problem lösen.

Den Ansatz den ich verwendet haben findest du hier ...


Gruß Dr.D.
 

lackschuh

Mitglied
Also ich habs nun hin bekommen nach langem hin und her. Hier die Lösung, wenn ein Anfänger wie ich es bin das selbe Problem haben sollte:

Java:
  //DB-Abfrage----------------------------------------
    	  
    	  @Override
    	 
    	  protected Boolean doInBackground() throws Exception {
    		  
    		  Connection verbindung = null;
    			try
    			{
    				verbindung = DBStarter.getConnection();
    			} catch (InstantiationException e1)
    			{
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    			try
    			{
    				verbindung = DBStarter.getConnection();
    			} catch (InstantiationException e1)
    			{
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
    		  
    	  System.out.println("Action Triggred so now I am populating the buyer.");
    	  PreparedStatement psConsigneeA0 = verbindung.prepareStatement("select name from kunde");
    	  ResultSet rsConsigneeA0 = psConsigneeA0.executeQuery();
    	  while (rsConsigneeA0.next()) {
    	  publish( rsConsigneeA0.getString(1) );
    	  }
    	  rsConsigneeA0.close();
    	  psConsigneeA0.close();
    	  return Boolean.TRUE;
    	  }
        
 //-------------------------------------

Eine Frage hätte ich noch:
Was muss ich machen, dass die ComboBox eine Art Überschrift hat zB --Kunde wählen-- und nicht gleich den ersten Kunden lädt, so dass ein null Wert als erstes geladen wir. Denn bei meinem Dialog ist es nicht zwingend, dass ein Kunde zugewiesen wird. Darum kann in die DB auch ein null-Wert eingetragen werden und später dann per Update immer noch geändert werden.
 
Zuletzt bearbeitet:

lackschuh

Mitglied
Hallo

da die Beiträge nach einer gewissen zeit nicht mehr zu editieren sein, muss ich halt meine allerletzte Frage als neue Antwort posten.

Es funktioniert eigentlich schon fast alles nur das "refreshen" nicht. Wie der Thema-Eröffner schon fragte.
Wie werden die Daten nun in der Combobox aktualisiert. Wenn ich einen neuen Kunden anlege, dann muss ich bis jetzt das Programm schließen und neu starten, dann ist der neue Datensatz in der ComBo geladen.

Aber irgendwie muss es doch gehen, dass die Daten neu geladen werden, sobald ich die ComboBox öffne?

Vielen Dank für die Hilfe
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L actionListener für Button AWT, Swing, JavaFX & SWT 97
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3
W actionListener für JButton "Step" AWT, Swing, JavaFX & SWT 5
R Swing ActionListener für JButton bei Drücken AWT, Swing, JavaFX & SWT 3
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
B Actionlistener für MenuItem AWT, Swing, JavaFX & SWT 19
M ActionListener für JButton AWT, Swing, JavaFX & SWT 2
C ActionListener für dynamisches Menü AWT, Swing, JavaFX & SWT 8
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M Event Handling ActionListener übergeben ich checks net AWT, Swing, JavaFX & SWT 4
C Swing ComboBox - ActionListener deaktivieren AWT, Swing, JavaFX & SWT 2
S Button (ActionListener) funktioniert nicht, wenn y-Koordinate verändert wird AWT, Swing, JavaFX & SWT 5
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
A Swing ActionListener kann nicht hinzugefügt werden AWT, Swing, JavaFX & SWT 4
P Actionlistener - 3 klassen - kompliziert - auf methoden zugreifen AWT, Swing, JavaFX & SWT 3
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
M ProgressBar in ActionListener AWT, Swing, JavaFX & SWT 4
D AWT eigenem Knopf ActionListener zuweisen AWT, Swing, JavaFX & SWT 24
E Wert aus ActionListener geben AWT, Swing, JavaFX & SWT 4
J ActionListener per Innere Klasse oder e.getActionCommand() if-Abfrage? AWT, Swing, JavaFX & SWT 12
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
P Swing Seltsames ActionListener-Verhalten AWT, Swing, JavaFX & SWT 7
Oliver530 ActionListener von eigener ButtonKlasse AWT, Swing, JavaFX & SWT 16
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 2
Kenan89 statischer ActionListener keine Wirkung? AWT, Swing, JavaFX & SWT 3
C In der Schleife ActionListener aktivieren AWT, Swing, JavaFX & SWT 3
B Swing Problem beim ActionListener AWT, Swing, JavaFX & SWT 5
P Swing JPanel mit ActionListener mehrfach verwenden AWT, Swing, JavaFX & SWT 8
1 ActionEvent generieren und an ActionListener weiterleiten AWT, Swing, JavaFX & SWT 12
N Swing Klasse erbt von JDialog - Problem mit innerer ActionListener-Klasse AWT, Swing, JavaFX & SWT 6
N JCombobox und Actionlistener Aktion nur ausführen, wenn Useraktion ihn auslöst AWT, Swing, JavaFX & SWT 4
N Componente und Actionlistener AWT, Swing, JavaFX & SWT 5
C ActionListener AWT, Swing, JavaFX & SWT 6
Corben ActionListener Error AWT, Swing, JavaFX & SWT 2
F Wert durch ActionListener an Klasse übergeben AWT, Swing, JavaFX & SWT 3
I Swing Problem mit InputMap bei JButton (ActionListener) AWT, Swing, JavaFX & SWT 3
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
P Variablen in einem ActionListener zurücksetzen AWT, Swing, JavaFX & SWT 6
M AWT Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
A Swing Bug in Swing? Wenn checkbox disabled reagiert ActionListener nicht AWT, Swing, JavaFX & SWT 5
S ActionListener "nach oben weitergeben" AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben