JButton in JList - MouseEvent-Problem

Status
Nicht offen für weitere Antworten.

Rock Lobster

Bekanntes Mitglied
Servus,

ich habe eine JList, welche JPanels als Listenelemente enthält, die wiederum einige Unter-Elemente enthalten, unter anderem auch JButtons.

Das Problem ist nur, daß die MouseEvents auf dem Button nun nicht mehr funktionieren, weil die JList diese wohl nicht weiterleitet. Ich habe schon einige Dinge ausprobiert (z.B. direkt auf AWT-Events hören, oder die MouseEvents von der JList abfangen und per processMouseEvent() an das enthaltene Panel weitergeben), aber leider alles ohne Erfolg.

Wie kann ich dafür sorgen, daß der Button ordnungsgemäß funktioniert, obwohl er in einer Liste drinsteht?
Ich hoffe, ihr könnt mir helfen.

Schöne Grüße
Rock Lobster
 

kleiner_held

Top Contributor
Meine erste Frage ist ob du die JPanels wirklich als Elemente in der JList hast oder nur einen entsprechenden ListCellRenderer verwendest.

Das von dir beschriebene Verhalten ist mit JList nicht moeglich, da diese Klasse nur CellRenderer aber keine CellEditoren verwendet - dazu muesste man dann auf JTable umsteigen.
Falls du aber eh schon fuer jeden Eintrag ein JPanel erstellt verstehe ich nicht wozu du noch eine JList brauchst.
 

Rock Lobster

Bekanntes Mitglied
Nein also das macht der ListCellRenderer. Der gibt einfach ein Panel zurück.

Aber wenn es nicht geht, dann werde ich wohl auf die Liste verzichten müssen und stattdessen die Panels einfach so untereinander anordnen. Dann muß ich halt auch das Selektieren usw. selbst programmieren.


EDIT: Okay, JTable wäre evtl. auch noch eine Möglichkeit... werd ich mir mal anschauen. Danke schonmal für den Tip!
 

kleiner_held

Top Contributor
Die Komponenten die der CellRenderer zurueckgibt werden wirklich nur zum Rendern genommen, die sind also nicht in den ComponentTree eingebunden und erhalten deswegen auch keine Events.
In dem Fall hilft nur eine JTable mit TableCellEditor, denn solange eine Zelle editiert wird ist der Editor (die Component) auch wirklich eigebunden, und erhaelt alle Events.
 

Rock Lobster

Bekanntes Mitglied
Ahh okay, d.h. der CellRenderer gibt - vereinfacht gesagt - nur das eigentliche Bild zurück, damit die GUI halt gezeichnet werden kann? Dann ist das Problem klar. Okay dann werde ich mir wirklich mal die JTable anschauen...
 

Rock Lobster

Bekanntes Mitglied
Also ich bin nun auf JTable umgestiegen und hab meinen eigenen TableCellEditor eingebaut, aber die Events gehen immer noch nicht durch :(

Habe auch schon ein bißchen mit den Rückgabewerten rumgespielt, z.B. bei isCellEditable() usw., aber es funktioniert leider nicht.
 
M

Michael...

Gast
zeig doch mal ein bisschen Code, vor allem den des Editors, dann kann man mehr dazu sagen
 

Rock Lobster

Bekanntes Mitglied
Code:
	@Override
	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column)
	{
		if (value instanceof ContactPanel)
		{
			ContactPanel panel = (ContactPanel)value;
			panel.setToolTipText(panel.getName());
			
			if (isSelected)
			{
				panel.setBackground(table.getSelectionBackground());
				panel.setForeground(table.getSelectionForeground());
			}
			
			return panel;
		}
		
		if (value instanceof Component)
			return (Component)value;
		
		return null;
	}


	@Override
	public void addCellEditorListener(CellEditorListener l)
	{
	}


	@Override
	public void cancelCellEditing()
	{
	}


	@Override
	public Object getCellEditorValue()
	{
		return null;
	}


	@Override
	public boolean isCellEditable(EventObject anEvent)
	{
		return true;
	}


	@Override
	public void removeCellEditorListener(CellEditorListener l)
	{
	}


	@Override
	public boolean shouldSelectCell(EventObject anEvent)
	{
		return true;
	}


	@Override
	public boolean stopCellEditing()
	{
		return false;
	}
 
M

Michael...

Gast
Rock Lobster hat gesagt.:
Code:
	@Override
	public Component getTableCellEditorComponent(JTable table, Object value,
			boolean isSelected, int row, int column)
	{
		if (value instanceof ContactPanel)
		{
			ContactPanel panel = (ContactPanel)value;
			panel.setToolTipText(panel.getName());
			
			if (isSelected)
			{
				panel.setBackground(table.getSelectionBackground());
				panel.setForeground(table.getSelectionForeground());
			}
			
			return panel;
		}
		
		if (value instanceof Component)
			return (Component)value;
		
		return null;
	}

Das wird Dir als Editor vermutlich immer null zurückliefern, da die Variable value den Dateninhalt repräsentiert und spätestens nach dem ersten Aufruf des Editors auf null gesetzt wird siehe Deinen Code Zeile 41.

Kleiner Tip leite nach Möglichkeit den Editor von AbstractCellEditor ab, dann musst nicht alle Methoden von TableCellEditor überschreiben.
 

Rock Lobster

Bekanntes Mitglied
Also angezeigt werden die Einträge schon, von daher liefert er wohl nicht null zurück. Ich kann bloß den darin enthaltenen Button nicht anklicken, sprich, die Events werden wieder nicht an die inneren Components weitergeleitet.
 

kleiner_held

Top Contributor
Beispiel siehe unten. Ist nicht unbedingt eine Augenweide, sollte aber das Prinzip verdeutlichen. Allgemein wuerde ich aber ueberlegen ob es wirklich noetig ist JPanels als model values zu verwenden.

Code:
public class TableCellEditorSample
{
	public static void main(String[] args)
	{
		JFrame frame = new JFrame();
		DefaultTableModel defaultTableModel = new DefaultTableModel(new Object[][]{{"Line 1", new MyPanel("ABC", "ABC")}, {"Line 2", new MyPanel("DEF", "DEF")}}, new String[] {"Header", "Header"})
		{
			@Override
			public Class<?> getColumnClass(int columnIndex)
			{
				if (columnIndex == 1)
				{
					return MyPanel.class;
				}
				return super.getColumnClass(columnIndex);
			}
		};
		JTable table = new JTable(defaultTableModel);
		table.getColumnModel().getColumn(0).setPreferredWidth(40);
		table.getColumnModel().getColumn(1).setPreferredWidth(200);
		table.doLayout();
		MyTableCellEditorAndRenderer editorAndRenderer = new MyTableCellEditorAndRenderer();
		table.setDefaultRenderer(MyPanel.class, editorAndRenderer);
		table.setDefaultEditor(MyPanel.class, editorAndRenderer);
		table.setRowHeight(25);
		frame.add(table);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(400, 300);
		frame.setVisible(true);
	}
	
	/**
	 * Editor und renderer fuer die Tabelle
	 */
	private static class MyTableCellEditorAndRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer
	{
		MyPanel panel;
		
		public Object getCellEditorValue()
		{
			return panel;
		}
		
		public boolean isCellEditable(EventObject anEvent) 
		{
			if (anEvent instanceof MouseEvent) 
			{ 
				return ((MouseEvent)anEvent).getClickCount() >= 2;
			}
			return true;
		}
		
		public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
		{ 
			panel = (MyPanel) value;
			setColor(panel,table, isSelected);
			return panel;
		}	

		public boolean stopCellEditing()
		{
			panel.getLabel().setText(panel.getTextField().getText());
			return super.stopCellEditing();
		}
		
		public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
				boolean hasFocus, int row, int column)
		{	
			MyPanel panel = (MyPanel) value;
			setColor(panel,table, isSelected);
			return panel;	
		}
		
		private void setColor(MyPanel panel, JTable table, boolean isSelected)
		{
			if (isSelected)
			{
				panel.setBackground(table.getSelectionBackground());
			} 
			else
			{
				panel.setBackground(table.getBackground());
			}
		}
	}
	
	/**
	 * Panel zum Anzeigen und editieren.
	 */
	private static class MyPanel extends JPanel
	{
		JTextField textField;
		JLabel label;
		
		private MyPanel(String text, String text2)
		{
			setLayout(new BorderLayout());
			setBorder(new EmptyBorder(3,3,3,3));
			label = new JLabel(text);
			textField = new JTextField(text2, 20);
			add(label, BorderLayout.WEST);
			add(textField, BorderLayout.CENTER);
			add(new JButton(new AbstractAction("Klick") {
				public void actionPerformed(ActionEvent e)
				{
					JOptionPane.showMessageDialog(null, "Test");
				}
			}), BorderLayout.EAST);
		}

		private JTextField getTextField()
		{
			return textField;
		}

		private JLabel getLabel()
		{
			return label;
		}
	}
}
 

Rock Lobster

Bekanntes Mitglied
Danke für das Beispiel, aber irgendwie will das immer noch nicht so recht. Manche Tabelleneinträge kann ich per Maus gar nicht auswählen (nur per Tastatur), und der Button funktioniert meist auch nur in einem einzigen Feld (und dann nur nach mehrmaligem Klicken).

Ich glaube mir bleibt wohl nichts anderes übrig als einfach ein ganz normales Panel mit FlowLayout oder sonstwas zu nehmen und das Handling mit dem Selektieren usw. selbst zu programmieren.

Trotzdem danke für die Hilfe!
 

kleiner_held

Top Contributor
In dem Beispiel wird Editieren erst mit einem Doppelklick gestartet.
Code:
public boolean isCellEditable(EventObject anEvent)
{
   if (anEvent instanceof MouseEvent)
   {
       return ((MouseEvent)anEvent).getClickCount() >= 2;
   }
   return true;
}
Ansonsten scheint aber trotzdem eine JTable fuer deine Anwandung unpassend zu sein, deswegen glaube ich auch dass du mit einem einfachen Panel besser faehrst.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
R Swing Files auflisten (JButton, JList, Exception) AWT, Swing, JavaFX & SWT 4
H JFormatterTextField und JButton in JList (ListCellRenderer) AWT, Swing, JavaFX & SWT 2
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
S Swing Rückmeldung für JButton AWT, Swing, JavaFX & SWT 4
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
U Event Handling JButton Actionevent: starte Spiel AWT, Swing, JavaFX & SWT 4
E JButton füllt ganzes JPanel auf AWT, Swing, JavaFX & SWT 6
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
Kandum Swing JButton - onclick -> Grafikfehler AWT, Swing, JavaFX & SWT 2
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
M Problem mit FlowLayout, JLabel und JButton AWT, Swing, JavaFX & SWT 4
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben