Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal

v7t4

Mitglied
Hallo alle,

ich kriege leider keine Lösung im Internet für das folgende Problem. Es gibt ein selbst gebastelter Button, der mehrere JLabels und andere Widgets beinhalten soll und von JToggleButton erbt. Wenn ich diesen in eine Zelle von JTable tun, funktioniert das Click-Event nur beim zweiten Drucken auf die Zelle, wenn ich jedoch alle Widgets von dem Button entferne, kommt das Event sofort an dem Button an.

Gibt es vielleicht ein Workaround, dass auch das erste Click-Event an den Button durchreicht wird? Hier ist ein Beispielcode. Vielen Dank.

Java:
package sandbox;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractCellEditor;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;

public class ClickableCustomButtonInTable extends JToggleButton {

	public ClickableCustomButtonInTable() {
		Dimension d = new Dimension(100, 100);
		JLabel lFirst = new JLabel("1st label");
		lFirst.setPreferredSize(d);

		JLabel lSecond = new JLabel("2nd label");
		lSecond.setPreferredSize(d);

		JPanel panel = new JPanel();
		panel.setOpaque(true);

		panel.setLayout(new BorderLayout());
		panel.add(lFirst, BorderLayout.NORTH);
		panel.add(lSecond, BorderLayout.SOUTH);
		add(panel); //if i comment this line out the click event gets triggered immediately as expected
		addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("Button clicked");
			}
		});
	}

	private static class CustomButtonRenderer implements TableCellRenderer {

		private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();

		@Override
		public Component getTableCellRendererComponent(JTable table,
				Object value, boolean isSelected, boolean hasFocus, int row,
				int column) {
			return button;
		}
	}

	private static class CustomButtonEditor extends AbstractCellEditor
			implements TableCellEditor {

		private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();

		@Override
		public Object getCellEditorValue() {
			return button.getText();
		}

		@Override
		public Component getTableCellEditorComponent(JTable table,
				Object value, boolean isSelected, int row, int column) {
			return button;
		}

	}

	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(new Dimension(200, 200));
		Container content = frame.getContentPane();
		TableModel model = new AbstractTableModel() {

			@Override
			public Object getValueAt(int rowIndex, int columnIndex) {
				return null;
			}

			@Override
			public int getRowCount() {
				return 1;
			}

			@Override
			public int getColumnCount() {
				return 1;
			}

			@Override
			public boolean isCellEditable(int rowIndex, int columnIndex) {
				return true;
			}

			@Override
			public Class<?> getColumnClass(int columnIndex) {
				return ClickableCustomButtonInTable.class;
			}
		};

		JTable table = new JTable(model);
		// table.setBounds(new Rectangle(0, 0, content.getWidth(), content
		// .getHeight()));
		table.setRowHeight(frame.getHeight());
		table.setDefaultRenderer(ClickableCustomButtonInTable.class,
				new CustomButtonRenderer());
		table.setDefaultEditor(ClickableCustomButtonInTable.class,
				new CustomButtonEditor());

		content.add(table);
		content.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 

v7t4

Mitglied
Was meinst du damit? Die Methode CustomButtonEditor#getTableCellEditorComponent() liefert schon den CustomButton zurück.
 

Ebenius

Top Contributor
Also ich bekomme in meinem beispiel die Events genau wie erwartet.

Java:
/* (@)CellEditorFun.java */

/* Copyright 2012 Sebastian Haufe

 * Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       [url]http://www.apache.org/licenses/LICENSE-2.0[/url]

 * Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.EventObject;

import javax.swing.*;
import javax.swing.table.TableCellEditor;

/**
 * Tests a toggle button as table cell editor.
 * 
 * @version $Revision$ as of $Date$
 * @author Sebastian Haufe
 * @since Playground-3.8
 */
public class CellEditorFun {

  /** Creates the GUI. Call on EDT, only! */
  static void createAndShowGui() {
    final JTable table = new JTable(2, 2);
    final ToggleButtonCellEditor edi = new ToggleButtonCellEditor();
    table.setDefaultEditor(Object.class, edi);

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

    final JFrame f = new JFrame("Test Frame: CellEditorFun"); //$NON-NLS-1$
    f.setContentPane(contentPane);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.setVisible(true);
  }

  /** @param args ignored */
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

      public void run() {
        createAndShowGui();
      }
    });
  }

  private static class ToggleButtonCellEditor extends AbstractCellEditor
    implements TableCellEditor {

    private static final long serialVersionUID = 1L;
    private final JToggleButton button = new JToggleButton("Click");

    /** Creates a new {@code CellEditorFun.ToggleButtonCellEditor}. */
    public ToggleButtonCellEditor() {
      button.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {
          System.out.println("Clicked");
        }
      });
    }

    @SuppressWarnings("boxing")
    public Object getCellEditorValue() {
      return button.isSelected();
    }

    public Component getTableCellEditorComponent(
          JTable table,
          Object value,
          boolean isSelected,
          int row,
          int column) {
      button.setSelected(Boolean.TRUE.equals(value));
      return button;
    }

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

v7t4

Mitglied
Ja, das geht, aber nur solange der Button keinen Panel drin hat.

Das folgende würde nicht mehr gehen
add ( new JLabel("first label"))
add ( new JLabel("second label"))
 

bERt0r

Top Contributor
Ähem du addest ein Panel auf einen Button? Kannst du mir den Sinn dahinter erklären? Ich bin mir nämlich nicht sicher ob das überhaupt funktionieren sollte.
 

Ebenius

Top Contributor
Hm, also ein InputEvent (Mouse, Key) wird immer an die Komponente gesandt die am weitesten oben in der Z-Order liegt. Wenn Du einen Button bedeckst, dann funktioniert der ggf. nicht richtig. Wozu benötigst Du denn ein Panel das auf einem JToggleButton liegt?

Ebenius
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
F JavaFX Custom Exceptions AWT, Swing, JavaFX & SWT 5
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Gluon Scene Builder Custom AWT, Swing, JavaFX & SWT 0
B JavaFX Custom TextInputControl AWT, Swing, JavaFX & SWT 1
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
F JavaFX Custom ListView erstellt ghost Element AWT, Swing, JavaFX & SWT 3
X Custom Controls AWT, Swing, JavaFX & SWT 5
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
L JavaFX Custom control mit Hover Effekt AWT, Swing, JavaFX & SWT 2
M Swing JColorchooser anpassen - custom style? AWT, Swing, JavaFX & SWT 0
M JavaFX Parameter für Custom Control in FXML übergeben? AWT, Swing, JavaFX & SWT 4
B Custom JTabbedPane-Tab-Design AWT, Swing, JavaFX & SWT 2
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
G TitledPane Custom Title AWT, Swing, JavaFX & SWT 6
N Custom JButton Feld aus Parent lesen lassen AWT, Swing, JavaFX & SWT 11
lumo SWT JFace Databinding +Custom Table AWT, Swing, JavaFX & SWT 2
B Swing JTable custom ColumnModel Problem AWT, Swing, JavaFX & SWT 5
W Swing Tag Oder Custom Eintrag AWT, Swing, JavaFX & SWT 7
algorismi Custom JDesktopIcon AWT, Swing, JavaFX & SWT 5
hdi Custom Cursor: Problem mit Größe AWT, Swing, JavaFX & SWT 5
N JComboBox mit Custom Object AWT, Swing, JavaFX & SWT 2
V Frage zu JScrollPane mit Custom Headern, mit Beispiel AWT, Swing, JavaFX & SWT 2
S [S] custom tree componente AWT, Swing, JavaFX & SWT 8
Z MessageDialog mit Custom panel erstellen AWT, Swing, JavaFX & SWT 2
C JToggleButton disabled Text Color AWT, Swing, JavaFX & SWT 11
Paul15 JCheckBox und JToggleButton AWT, Swing, JavaFX & SWT 5
P Swing JToggleButton Links- und Rechtsklick AWT, Swing, JavaFX & SWT 4
T Swing JToggleButton Zustand AWT, Swing, JavaFX & SWT 2
E JToggleButton automatisch nach drücken loslassen AWT, Swing, JavaFX & SWT 3
kodela Swing JToggleButton und Tastatur AWT, Swing, JavaFX & SWT 2
P Swing JComboBox mit JToggleButton kombinieren AWT, Swing, JavaFX & SWT 4
C ausgewählte JtoggleButton als Variablenwert ausgeben AWT, Swing, JavaFX & SWT 14
B JToggleButton und StyledEditorKit.ItalicAction() AWT, Swing, JavaFX & SWT 2
P JToggleButton AWT, Swing, JavaFX & SWT 6
M Swing Selektion mehrerer JToggleButton's in einer Gruppe AWT, Swing, JavaFX & SWT 5
K JToggleButton deaktivieren (komplettes event nehmen) AWT, Swing, JavaFX & SWT 2
C Swing JToggleButton und Icon AWT, Swing, JavaFX & SWT 2
G JToggleButton - Hintergrundfarbe beim Drücken festlegen AWT, Swing, JavaFX & SWT 4
G JToggleButton pressed geht nicht AWT, Swing, JavaFX & SWT 2
gieser jToggleButton: Text unter Bild AWT, Swing, JavaFX & SWT 2
F JToggleButton in AWT umsetzen (Button soll stecken bleiben) AWT, Swing, JavaFX & SWT 4
G JToggleButton AWT, Swing, JavaFX & SWT 6
G welcher Jtogglebutton geklickt? AWT, Swing, JavaFX & SWT 3
G JToggleButton mit Bild AWT, Swing, JavaFX & SWT 6
O ButtonGroup + JToggleButton &;nbsp] AWT, Swing, JavaFX & SWT 6
S Zweidimensionales Array - JToggleButton AWT, Swing, JavaFX & SWT 3
E JToggleButton Zustandsänderung AWT, Swing, JavaFX & SWT 4
M JToggleButton immer nur einen aktivieren AWT, Swing, JavaFX & SWT 2
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
S HPRO und UPRO gemeinsame JTABLE gemeinsamer RENDERER ? AWT, Swing, JavaFX & SWT 1
F Swing JTable - MultiHeader inkl. Eingabemöglichkeit AWT, Swing, JavaFX & SWT 1
S JTable - Feldinhalte anzeigen AWT, Swing, JavaFX & SWT 15
D Swing JTable Spaltenbreite AWT, Swing, JavaFX & SWT 1
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
G jTable - getSelectedRow() AWT, Swing, JavaFX & SWT 3
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
D Tastaturabfragen CTRL+t, CTRL+E bei eine JTable, bestehend aus JTextAteas AWT, Swing, JavaFX & SWT 4
P Checkboxes in JTable nicht editable AWT, Swing, JavaFX & SWT 9
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
izoards JTable in CSV File schreiben... AWT, Swing, JavaFX & SWT 23
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
M JTABLE / wie oft wurde gewürfelt. AWT, Swing, JavaFX & SWT 1
F JTable vergrößern AWT, Swing, JavaFX & SWT 2
H JTable: Diverse NullPointer-Exceptions zur Laufzeit AWT, Swing, JavaFX & SWT 3
J Swing Werte des JTable werden nicht angezeigt AWT, Swing, JavaFX & SWT 9
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
HoT Einzelne Zelle in JTable Rahmen unten setzen AWT, Swing, JavaFX & SWT 24
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
H JTable im JSplitPane darstellen AWT, Swing, JavaFX & SWT 2
MadMax2506 Swing JTable lädt sehr lange AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
R Swing JTable und Spaltenausrichtung AWT, Swing, JavaFX & SWT 8
G JTable füllen AWT, Swing, JavaFX & SWT 1
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
J Datensatz in jTable ausgeben AWT, Swing, JavaFX & SWT 3
M Swing Automatischer Editorstart in JTable-Zelle AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
adiko01 JTable: Nur markierte Zeilen aus der Tabelle in CSV exportiern AWT, Swing, JavaFX & SWT 9
M JTable.setDefaultRenderer(...) greift nicht AWT, Swing, JavaFX & SWT 0
J JTable: Eingabe in Tabellenzelle korrigieren AWT, Swing, JavaFX & SWT 4
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
D MySQL Daten in JTable anzeigen AWT, Swing, JavaFX & SWT 2
H Swing Jtable extra spalte AWT, Swing, JavaFX & SWT 6
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
A JTable mit Daten füllen AWT, Swing, JavaFX & SWT 1
VfL_Freak Swing Einzelne Zeile in jTable selektieren klappt nicht AWT, Swing, JavaFX & SWT 7
N AWT jTable CellRenderer AWT, Swing, JavaFX & SWT 6
T Swing JTable valueChanged datensatz löschen AWT, Swing, JavaFX & SWT 1
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
S Jtable defaultRenderer wohin damit ? AWT, Swing, JavaFX & SWT 23

Ähnliche Java Themen

Neue Themen


Oben