Mouse Events in einer sortierten JTable unterscheiden

scar

Mitglied
Hallo zusammen,

ich benutze eine JTable mit einem DefaultSorter. Ohne das ich was implementieren muss werden die einzelnen Spalten durch einen einfachen Klick auf oder abwärts wunderbar sortiert. :toll:

Jetzt habe ich am TableHeader einen MouseListener hinzugefügt, der bei einem Doppelklick auf die Spaltengrenzen (es erscheint ein Doppelpfeil) die betreffende Spalte auf "optimierte Spaltenbreite" setzt. Funktioniert auch wunderbar, hat aber leider den Nebeneffekt, das von der betroffene Spalte dann auch die Sortierung geändert wird.

Wie kann ich verhindern, das der Sorter bei einem Doppelklick reagiert? Geht das evtl. ohne das ich am Sorter was überschreiben muss? ???:L

Gruß
Arno
 

scar

Mitglied
das ist alles was ich zur Zeit tue, wenn die Tabelle konstruiert wird und es funktioniert ja auch wunderbar mit Ausnahme des beschriebenen Nebeneffekts:

Java:
	:
	JTable workspaceTable = new JTable();

	myWorkspaceTableModel = new WorkspaceTableModel(ParentContainer);
	workspaceTable.setModel(myWorkspaceTableModel);
	// Default Sorter aktivieren
	sorter = new TableRowSorter<WorkspaceTableModel>(myWorkspaceTableModel);
	workspaceTable.setRowSorter(sorter);
	// Listener für Spaltenbreiteoptimierung hinzufügen
	workspaceTable.getTableHeader().addMouseListener(new ColumnFitAdapter());
	// Mehrfachselektion möglich machen
	workspaceTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
	:

wobei der MouseListener folgendes tut:

Java:
	:
public class ColumnFitAdapter extends MouseAdapter
{
	public void mouseClicked(MouseEvent e)
	{
		if ( e.getClickCount() == 2 )
		{
			// Stelle Spaltenbreite optimal ein
			:
		}
	}
	:

Was mir halt nicht klar ist, an welcher Stelle ich etwas tun muss, damit der erste Klick vom Doppelclick nicht vom Sorter ausgewertet wird. Geht der Mouseevent evtl. direkt paralell an alle Listener oder wird er eventuell hintereinander an die verschiedenen Listener geschickt und könnte man nach der Konsumierung den Event einfach unterdrücken?
 

ssoul26

Bekanntes Mitglied
Das Problem ist, dass der EventHandler vorher nicht wissen kann, ob da jetzt noch ein Klick folgt oder nicht. Daher schiesst er das erste Event sofort ab.
 

scar

Mitglied
eigentlich von mir aus nichts, nur ist es in allen bei uns bekannten anderen Anwendungen so, z.B. Excel, dass das so ist und der Benutzer es so gewöhnt ist. Deshalb hätte ich es schon sehr gerne, das es gleich funktioniert.
Was müsste ich den tun, um den 'einfach Click' vom 'Doppel Click' unterscheiden zu können? Könnte mir vorstellen, das das in anderen Kontexten auch schon mal gelöst wurde. Ich scheine aber nicht nach den richtigen Stichwörtern zu googeln, denn da find ich auch nichts.
 

ssoul26

Bekanntes Mitglied
Du könntest bei Klick einen Thread starten, der paar Millisekunden wartet und dann eine aktion ausführt. Anschliessend nullst du den Thread.

Ablauf 1 Klick:

1. Klick- > Thread startet und wartet erstmal ab
2. Nach ablauf der Zeit kein neuer Klick -> Aktion für einen Klick

Ablauf 2 Klick:

1. Klick- > Thread startet und wartet erstmal ab.
2. Klick -> Der Thread ist !=null also war da vorher einer -> Doppelklickaktion
 

KrokoDiehl

Top Contributor
Schonmal mit
Code:
event.consume()
probiert? Vielleicht hilft das ja, wenn du es nach deiner Doppelklick-Behandlung durchführst.
 

scar

Mitglied
Hilft leider nicht, da der Doppelclick nach dem einfach Click kommt.

Aber was als Unterscheidungsmerkmal taugt, wäre wenn man feststellt, welchen Mauszeiger man beim Klicken hat, da in dem Fall, wenn man auf die Spaltengrenze zeigt aus dem Mauszeiger ein Doppelpfeil wird. Kriegt man diese Info aus dem Event heraus?
 

ssoul26

Bekanntes Mitglied
Guter Ansatz :)
Java:
   public void mouseClicked(MouseEvent e) {

        if(e.getSource()instanceof JTableHeader){
           JTableHeader header= (JTableHeader) e.getSource();
           if(header.getCursor().getType()!= Cursor.DEFAULT_CURSOR){
              System.out.println("Resize?");
              
           }
           
        }

   }
 

scar

Mitglied
Obwohl der Event meines Erachtens in den relevanten Fällen konsumiert wird, springt der 'sorter' immer noch an. Kann es sein das der Sorter den Event zuerst bekommt?
Nach meinem Verständnis sollte der Event nur in meinem registrierten Listener erst mal bearbeitet werden. Oder muss man noch was anderes außer einem 'consum()' machen, damit er nicht weiterbenutzt werden kann?

Hier die Ausgabe, wenn ich zuerst Doppelclick auf die Spalte und danach auf die Spaltengrenze mache:
:
No action at 'left button (clicks: 1 / cursortype: Standardcursor)'
No action at 'left button (clicks: 2 / cursortype: Standardcursor)'
Sorter should not consume this event! 'left button (clicks: 1 / cursortype: Skaliercursor nach rechts)'
No action at 'left button (clicks: 1 / cursortype: Skaliercursor nach rechts)'
Sorter should not consume this event! 'left button (clicks: 2 / cursortype: Skaliercursor nach rechts)'
Consuming column optimization event now 'left button (clicks: 2 / cursortype: Skaliercursor nach rechts)'...
:

Noch eine Idee?

Hier ist noch die volständige Implementation des Listeners:
Java:
package util.tablesorting;

import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JTable;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;

/**
 * Ermöglicht es einer Tabelle durch klicken zwischen zwei Spalten die Größe automatisch
 * einzustellen.
 */
public class ColumnFitAdapter extends MouseAdapter
{
	public void mouseClicked(MouseEvent mouseEvt)
	{
		// Ist Listener an falschem Objekttyp registriert?
		if ( !(mouseEvt.getSource() instanceof JTableHeader) )
		{
			System.err.println("Listener registered at wrong object type '" + mouseEvt.getSource().getClass().getName() + "' instead of expected type 'JTableHeader'");
			return;
		}

		// Nur für Debugzwecke
		String whichKey;
		switch ( mouseEvt.getButton() )
		{
			case MouseEvent.NOBUTTON: whichKey = "no button";     break;
			case MouseEvent.BUTTON1:  whichKey = "left button";   break;
			case MouseEvent.BUTTON2:  whichKey = "middle button"; break;
			case MouseEvent.BUTTON3:  whichKey = "right button";  break;
			default:  				  whichKey = new Integer(mouseEvt.getButton()).toString() + " button";   break;
		}
		whichKey += " (clicks: " + mouseEvt.getClickCount();
		
		JTableHeader header = (JTableHeader)mouseEvt.getSource();
		whichKey += " / cursortype: " + header.getCursor().getName() + ")";

		// Spaltenoptimierung erfolgt nur bei Doppelklick mit Standardmaustaste (BUTTON1) und
		// wenn der Cursor ungleich Defaultcursor ist
		boolean optimizeColumn = (mouseEvt.getButton() == MouseEvent.BUTTON1) && (header.getCursor().getType() != Cursor.DEFAULT_CURSOR);

		// auch einfach Klick mit linker Maustaste consumieren
		if ( optimizeColumn )
		{
			// wenn der Cursor kein DefaultCursor ist auf jeden
			// Fall konsumieren durch Sorter verhindern
			System.out.println("Sorter should not consume this event! '" + whichKey + "'");
			mouseEvt.consume();
		}
		
		// Nur bei Doppelclick
		if ( optimizeColumn && (mouseEvt.getClickCount() == 2) )
		{
			System.out.println("Consuming column optimization event now '" + whichKey + "'...");
			TableColumn tableColumn = getResizingColumn(header, mouseEvt.getPoint());
			if ( tableColumn == null )
			{
				return;
			}
			int col = header.getColumnModel().getColumnIndex(tableColumn.getIdentifier());
			JTable table = header.getTable();
			int rowCount = table.getRowCount();
			int width = (int)header.getDefaultRenderer().getTableCellRendererComponent(table, tableColumn.getIdentifier(), false, false, -1, col)
				.getPreferredSize().getWidth();
			// Suche die breiteste Zelle dieser Spalte
			for ( int row = 0; row < rowCount; row++ )
			{
				int preferedWidth = (int)table.getCellRenderer(row, col)
					.getTableCellRendererComponent(table, table.getValueAt(row, col), false, false, row, col).getPreferredSize().getWidth();
				width = Math.max(width, preferedWidth);
			}
			// Setze die Spalte auf den ermittelten Wert
			header.setResizingColumn(tableColumn); // this line is very important
			tableColumn.setWidth(width + table.getIntercellSpacing().width);
		} else
		{
			System.out.println("No action at '" + whichKey + "'");
		}
	}

	private TableColumn getResizingColumn(JTableHeader header, Point p)
	{
		return getResizingColumn(header, p, header.columnAtPoint(p));
	}

	private TableColumn getResizingColumn(JTableHeader header, Point p, int column)
	{
		if ( column == -1 )
		{
			return null;
		}
		Rectangle r = header.getHeaderRect(column);
		r.grow(-3, 0);
		if ( r.contains(p) )
			return null;
		int midPoint = r.x + r.width / 2;
		int columnIndex;
		if ( header.getComponentOrientation().isLeftToRight() )
			columnIndex = (p.x < midPoint) ? column - 1 : column;
		else
			columnIndex = (p.x < midPoint) ? column : column - 1;
		if ( columnIndex == -1 )
			return null;
		return header.getColumnModel().getColumn(columnIndex);
	}
}
 

ssoul26

Bekanntes Mitglied
Der TableSorter hat eine private Klasse TableModelListener, da gibt es folgende private Klasse "private class MouseHandler extends MouseAdapter " dort umschreibst du die Funktion "public void mouseClicked(MouseEvent e)". Daher wird dein Event nicht richtig behandelt.
 

scar

Mitglied
Kannst Du ein Beispiel skizzieren, wie ich genau diese Methode in einer inneren privaten Klasse überschreiben kann? Bin gerade etwas überfordert und sehe vor lauter Klassen, Modellen, Tabellen und Views den Wald nicht mehr ???:L :bahnhof:
 

bERt0r

Top Contributor
Ich hab dir was gebastelt, ist zwar ein bisschen dirty macht aber was du willst. Kann jetzt aber nicht garantieren ob das auch mit allen look and feels funktioniert.
Java:
import java.awt.BorderLayout;

public class TableRowSorterDemo extends JFrame
{
	
	private JPanel contentPane;
	private JScrollPane scrollPane;
	private JTable table;
	private MouseListener[] headerListeners;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args)
	{
		EventQueue.invokeLater(new Runnable()
			{
				public void run()
				{
					try
					{
						TableRowSorterDemo frame = new TableRowSorterDemo();
						frame.setVisible(true);
					} catch (Exception e)
					{
						e.printStackTrace();
					}
				}
			});
	}
	
	/**
	 * Create the frame.
	 */
	public TableRowSorterDemo()
	{
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		table = new JTable();
		table.setModel(new DefaultTableModel(new Object[][] { { "Sepp", "11", "111" }, { "Fritz", "10", "120" },
				{ "Hansi", "5", "100" }, { null, null, null }, { null, null, null }, }, new String[] { "Name", "Alter",
				"Gr\u00F6\u00DFe" }));
		scrollPane.setViewportView(table);
		
		table.setAutoCreateRowSorter(true);
		
		headerListeners = table.getTableHeader().getMouseListeners();
		
		for (MouseListener l : headerListeners)
		{
			table.getTableHeader().removeMouseListener(l);
		}
		
		table.getTableHeader().addMouseListener(new MouseListener()
			{
				@Override
				public void mouseClicked(MouseEvent e)
				{
					JTableHeader header = (JTableHeader) e.getSource();
					if (header.getCursor().getType()!=Cursor.E_RESIZE_CURSOR)
					{
						for (MouseListener l : headerListeners)
						{
							l.mouseClicked(e);
						}
					} else
					{
						System.out.println("Resize Columns " + e.getSource());
						// resize Columns
					}
				}
				
				@Override
				public void mousePressed(MouseEvent e)
				{
					for (MouseListener l : headerListeners)
					{
						l.mousePressed(e);
					}
				}
				
				@Override
				public void mouseReleased(MouseEvent e)
				{
					for (MouseListener l : headerListeners)
					{
						l.mouseReleased(e);
					}
				}
				
				@Override
				public void mouseEntered(MouseEvent e)
				{
					for (MouseListener l : headerListeners)
					{
						l.mouseEntered(e);
					}
				}
				
				@Override
				public void mouseExited(MouseEvent e)
				{
					for (MouseListener l : headerListeners)
					{
						l.mouseExited(e);
					}
				}
				
			});
		
	}
	
}
 

scar

Mitglied
Vielen Dank für das Beispiel, ich werd es einbauen, werde aber wahrscheinlich erst nächste Woche dazu kommen. Sag aber dann Bescheid, ob's funktioniert hat.
 

scar

Mitglied
Ja, funktioniert!!! :toll: :cool:
War dann ja doch nicht so schlimm mit Überschreiben irgendwelcher internen Methoden im TableRowSorter.

Vielen Dank noch mal für euer Engagement und euer Ineresse.
 

scar

Mitglied
Ich hab das gemacht, was bERt0r vorgeschlagen hat, ich hab seinen Code von Zeile 55 bis 117 ans Ende meiner Initialisierung gestellt, nachdem sichergestellt ist, das alle gewünschten TableHeaderListener registriert sind. Die Liste der registrierten Listener merke ich mir dann in einer eigenen Variablen und lösche die Registrierungseinträge an dem betroffenen TableHeader. Dann trage ich nur noch einen Listener ein, der den Event und den Mauszeiger überprüft und der ruft dann in dem einen Fall nur den einen gewünschten Listener auf, in jedem anderen Fall bleibt das Verhalten unverändert.

Hat man noch mehr Listener, die etwas mit dem selben Event machen müssen, muss man die Logik entsprechend anpassen. Für meine Zwecke reicht die Vorgehensweise jedoch voll und ganz.

So sieht es dann mit meinem Code ab Zeile 68 aus:
Java:
                    if (header.getCursor().getType() != Cursor.E_RESIZE_CURSOR)
                    {
                        for (MouseListener l : headerListeners)
                        {
                            l.mouseClicked(e);
                        }
                    } else
                    {
                        System.out.println("Columns best fit " + e.getSource());
                        for (MouseListener l : headerListeners)
                        {
                            if ( l instanceof ColumnFitAdapter )
                            {
                                l.mouseClicked(e);
                            }
                        }
                    }

Damit kann ich mir dann in diesem Code auch wieder alle Überprüfungen sparen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G mouse events AWT, Swing, JavaFX & SWT 6
E JFace ListSelectionDialog & Mouse-Events? AWT, Swing, JavaFX & SWT 2
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
R Key und Mouse Events AWT, Swing, JavaFX & SWT 2
K Mouse Events der Scrollbar/pane AWT, Swing, JavaFX & SWT 2
N Mouse methods AWT, Swing, JavaFX & SWT 10
G Mouse Event in anderemm Event auslösen AWT, Swing, JavaFX & SWT 50
P kein Scrollen nach affinertransformation bei mouse dragged AWT, Swing, JavaFX & SWT 2
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
M Java FX Mouse over AWT, Swing, JavaFX & SWT 4
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
B GUI mit Mouse Touch AWT, Swing, JavaFX & SWT 27
A Mouse event und exit on close AWT, Swing, JavaFX & SWT 11
H Rechteck via Mouse bewegen AWT, Swing, JavaFX & SWT 2
H Java Robot mouse funktioniert nur auf Notebook nicht. AWT, Swing, JavaFX & SWT 4
lumo SWT Composite Mouse Track Lisetner AWT, Swing, JavaFX & SWT 2
K JButton nur dann aktivieren, wenn die Mouse 3 Sek. über dem Button bleibt AWT, Swing, JavaFX & SWT 2
M Mouse Wheel Listener reagiert mehrmals AWT, Swing, JavaFX & SWT 5
H fwststellen, ob sich Mouse auf dem Rand befindet AWT, Swing, JavaFX & SWT 3
Dit_ Buttons Mouse-Over Effekt AWT, Swing, JavaFX & SWT 8
Iron Monkey JTable 2 Selektionsfarben Mouse-Event AWT, Swing, JavaFX & SWT 8
D Mouse Koordinaten AWT, Swing, JavaFX & SWT 2
P Mouse Listener beenden AWT, Swing, JavaFX & SWT 14
raptorrs JFrame nur anzeigen, solange die Mouse gedrückt ist AWT, Swing, JavaFX & SWT 3
G JButton Mouse Over Text AWT, Swing, JavaFX & SWT 2
T Mouse Popup AWT, Swing, JavaFX & SWT 2
M Bug; Swing-Worker, Progressbar und Mouse AWT, Swing, JavaFX & SWT 22
R Mouse Wheel funktioniert nicht im JDialog ! AWT, Swing, JavaFX & SWT 4
T mouse-event auf jcolorchooser AWT, Swing, JavaFX & SWT 2
M eine zeichnen beim mouse ziehen AWT, Swing, JavaFX & SWT 8
V JPopupMenu Problem und Tipp zu mouse/key AWT, Swing, JavaFX & SWT 3
S Rechteck per Mouse aufziehen AWT, Swing, JavaFX & SWT 7
S Mouse-Event in JTable AWT, Swing, JavaFX & SWT 3
K Mouse Position nach Drag und Drop? AWT, Swing, JavaFX & SWT 4
M Grafikobjekte mit Mouse auswählen und verschieben AWT, Swing, JavaFX & SWT 2
D JLabel aus einem Mouse- bzw. KeyListener aendern AWT, Swing, JavaFX & SWT 2
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
D Swing Events vom JLayer abfangen AWT, Swing, JavaFX & SWT 2
D Transparentes Hauptfenster Events AWT, Swing, JavaFX & SWT 1
M Swing Hinter die Kulissen von Events (addActionListener) AWT, Swing, JavaFX & SWT 6
N JTextArea Events weiterleiten AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
J Events und Sleep? AWT, Swing, JavaFX & SWT 4
C MouseMotionListener fired keine Events mehr wenn in Button AWT, Swing, JavaFX & SWT 2
N Variablen in Events AWT, Swing, JavaFX & SWT 4
P AWT MouseListener unklare abhandlung von Events AWT, Swing, JavaFX & SWT 3
L Swing Auslöser eines Events finden? AWT, Swing, JavaFX & SWT 6
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
Weltall 7 AWT Maus-Events werden doppelt ausgeführt AWT, Swing, JavaFX & SWT 12
0 Events werden nicht ausgelöst AWT, Swing, JavaFX & SWT 2
V Swing Auslösen von zwei Events hintereinander AWT, Swing, JavaFX & SWT 4
T Swing Control und Events AWT, Swing, JavaFX & SWT 8
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
R Events - Nur auf eines reagieren AWT, Swing, JavaFX & SWT 3
T JComboBox: ActionListener/ItemListener wie nur auf bestimmte Events reagieren? AWT, Swing, JavaFX & SWT 7
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
K Alle Events abfangen mit GlassPane AWT, Swing, JavaFX & SWT 7
T SWT - Table Events AWT, Swing, JavaFX & SWT 3
hdi Events nicht plattform-unabhängig? AWT, Swing, JavaFX & SWT 14
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
G Reihenfolge von Events AWT, Swing, JavaFX & SWT 4
D Events bei Tabs in einem Editor AWT, Swing, JavaFX & SWT 2
F Probleme mit MouseWheel events in SWT AWT, Swing, JavaFX & SWT 13
M Globale Events in Windows abfangen AWT, Swing, JavaFX & SWT 2
T Hilfe zu Events? AWT, Swing, JavaFX & SWT 6
S Events abfangen, nicht durchlassen AWT, Swing, JavaFX & SWT 2
T Events unterdrücken AWT, Swing, JavaFX & SWT 8
G An die Quelle einen events kommen AWT, Swing, JavaFX & SWT 2
M Problem mit verschachtelten Events und kein ausweg in sicht AWT, Swing, JavaFX & SWT 3
W Vom JPanel bekomme ich keine Events AWT, Swing, JavaFX & SWT 5
V Events an untere Layers weitergeben AWT, Swing, JavaFX & SWT 2
V events skippen AWT, Swing, JavaFX & SWT 14
M Events auslagern? AWT, Swing, JavaFX & SWT 6
F Events AWT, Swing, JavaFX & SWT 8
N SWT: GUI Windows Events AWT, Swing, JavaFX & SWT 8
I Globale Tastatur-Events abfragen AWT, Swing, JavaFX & SWT 3
D Events werden zu oft aufgerufen AWT, Swing, JavaFX & SWT 4
G Events AWT, Swing, JavaFX & SWT 2
S Events fremdauslösen AWT, Swing, JavaFX & SWT 17
K Doppelte Events AWT, Swing, JavaFX & SWT 4
A Combobox Focus-Events, Tab in Tabelle AWT, Swing, JavaFX & SWT 7
D Events, Listener, GUI . Größeres Projekt AWT, Swing, JavaFX & SWT 4
A Vielschichtige GUI und Events? AWT, Swing, JavaFX & SWT 4
V JList mit Events Steuern ? AWT, Swing, JavaFX & SWT 15
S Rechner zu schnell für Events? AWT, Swing, JavaFX & SWT 14
G JTable und Events AWT, Swing, JavaFX & SWT 4
S Events bei 2 gleichen Jtree abfangen AWT, Swing, JavaFX & SWT 3
ShapeShifter JButton erzeugt zwei Events AWT, Swing, JavaFX & SWT 4
B Eigenes Events AWT, Swing, JavaFX & SWT 3
T JScrollPane-Events AWT, Swing, JavaFX & SWT 2
M JTable und Events AWT, Swing, JavaFX & SWT 4
K JComboBox: Endlosschleife durch Events AWT, Swing, JavaFX & SWT 4
K [JComboBox] ENTER löst zwei events aus? AWT, Swing, JavaFX & SWT 2
M Glasspane und dispatchen von Events AWT, Swing, JavaFX & SWT 6
H Events manuell aufrufen AWT, Swing, JavaFX & SWT 4
F JComboBox setEditable( true ) auf Tastatur Events reagieren AWT, Swing, JavaFX & SWT 4
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben