Swing JButton in einer Table Cell

Arekai

Mitglied
Hi.

Hab mich heute dran gewagt nen JButton in ne JTableModel Zelle einzubauen, funktioniert auch soweit, nur is das Verhalten beim Klicken auf den obersten Button (dort wo reihe 0 und column X ist) falsch.

Hab mich an das Tutorial hier gehalten.

Für die JButton Columns setze ich nen eigenen "MyBtnRenderer"(ext. JButton impl. TableCellRenderer) und nen eigenen "MyBtnEditor"(ext. DefaultCellEditor)

Hier mein Editor:
Java:
public class MyBtnEditor extends DefaultCellEditor {

	private JButton btn;
	private String  text;
	private boolean isPushed;

	public MyBtnEditor(JCheckBox checkBox, String text) {
		super(checkBox);
		this.text = text;
		btn = new JButton();
		btn.setOpaque(true);
		btn.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				fireEditingStopped();
			}
		});
	}

	public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
		btn.setText(text);
		isPushed = true;
		return btn;
	}

	public Object getCellEditorValue() {
		if (isPushed) {
			System.out.println("Ehh~ Sugoi desu ne!");
		}
		isPushed = false;
		return text;
	}

	public boolean stopCellEditing() {
		isPushed = false;
		return super.stopCellEditing();
	}

	protected void fireEditingStopped() {
		super.fireEditingStopped();
	}

}

Und hier mein Renderer:
Java:
public class MyBtnRenderer extends JButton implements TableCellRenderer {

	private String text;

	public MyBtnRenderer(String text) {
		setOpaque(true);
		this.text = text;
	}

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

Diese weise ich JButton Klassen zu bei meiner "MyTable" Klasse:
Java:
public class MyTable extends JTable {

	
	public MyTable(MyTableModel model) {
		super(model);
		
		setDefaultRenderer(JButton.class, new MyBtnRenderer("Save"));
		setDefaultEditor(JButton.class, new MyBtnEditor(new JCheckBox(), "Save"));
		
	}
}

Mein "MyTableModel" ist folgend:
Java:
public class MyTableModel extends DefaultTableModel {
	
	public MyTableModel(Vector dataMatrix, Vector<String> columnIdentifiers){
		super(dataMatrix, columnIdentifiers);
	}
	
	public Class<?> getColumnClass(int col){
		Object val = getValueAt(0,col);
		return val.getClass();
	}
	
	public boolean isCellEditable(boolean value){
		return true;
	}
	
	@Override
	public Object getValueAt(int row, int column) {
		Vector v = (Vector) dataVector.get(row);
		return v.get(column);
	}
}

Da ich mit keinen gewöhnlichen Typen arbeite und die befüllte Tabelle hier schlecht nachproduzieren kann wenigstens nen Screenshot:

So sieht alles nach der Initialisierung aus:
normalat.jpg

Hier funkionieren alle buttons richtig, mit Ausgabe bei nem Klick, gewohnter Animation etc. BIS auf den obersten in der ersten Zeile.

Wenn man auf den klickt passiert das hier:
obersterjbuttonfehler.jpg


Und nachfolgend sind auch alle anderen Buttons dann kaputt, wenn man die dann anklickt kommt auch entweder der übergebene TitleString oder die toString(). Jegliche Listener etc. reagieren nicht.
dominofehler.jpg


Die JButtons werden bei den Zeilenvectoren einfach immer am Ende mit drangehängt:
Java:
vector.add(new JButton());

und die kommen in die DataMatrix(Vector<Vector>) welche das TableModel bekommt.

Hat jemand ne Ahnung wo der Fehler liegen könnte?
 
S

SlaterB

Gast
das 'Editieren' der Button-Zelle wird wahrscheinlich zu einem setValueAt()-Aufruf führen,
überschreibe die Methode und schaue dir an was hineinkommt,
anscheinend ein String "Save", der wird gespeichert, getColumnClass() liefert dann String statt Button,

du könntest in überschriebener setValueAt() prüfen, ob an der Stelle in den Daten ein Button steht
und dann die Daten nicht per super weiterleiten,

-----

generell wäre es sparsamer, in den Daten keine großen JButton-Objekte zu speichern, die werden doch eh nicht verwendet,
du könntest dir eine komplett neue Klasse ButtonDummy erstellen,
wenn du dafür den Renderer und den Editor setzt, sollte alles wie bisher funktionieren

was auch immer du in die Daten einfügst, ob JButton oder ButtonDummy, verwende nach Möglichkeit eine statische Konstante,
nur EIN Objekt statt vieler, dann wäre es auch nicht ganz so schlimm wenn es bei JButton bleibt..
 

Michael...

Top Contributor
Ich persönlich würde keine Buttons ins TableModel stecken, eher eigene selbstgeschiebene aber auf jeden Fall einfacherer Objekte.
Und wenn man auf den "gedrückt" Effekt des Buttons verzichten kann, würde ich einen MouseListener anstelle des ButtonEditors verwenden - verringert m.M. die Komplexität. Und ausschließlich einen ButtonRenderer verwenden, damit der Anwender erkennt, dass man hier drücken kann.

Allgm. Anmerkungen:
- Warum übergibst Du Deinem ButtonEditor eine JCheckBox, die nie verwendet wird
- Da auf allen Buttons nur "Save" steht, könnte man sich das ständige setText(...) im ButtonRender sparen und nur einmalig im Konstruktor setzen.

Zum Problem:
Eine (evtl. auch die) Ursache, dass die Buttons verschwinden liegt darin, dass die
Code:
getCellEditorValue()
des Editors einen String zurück gibt. Der Rückgabewert dieser Methode wird in das TableModel geschrieben. D.h. an der Stelle des Models an der vorher ein JButton war, steht jetzt ein String. Damit wird für diese Zelle nicht mehr der DefaultRenderer/Editor für JButton.class sondern für String.class verwendet. Was dazu führt, dass im Renderer zunächst "Save" und bei nochmaligem Editieren "javax.swing.JButton..." angezeigt wird.
 
S

SlaterB

Gast
> Was dazu führt, dass im Renderer zunächst "Save" und bei nochmaligem Editieren "javax.swing.JButton..." angezeigt wird.

hey, vieles wie meine Antwort, nur wird "javax.swing.JButton..." kaum durch Editieren kommen ;)
sondern das (uneditierte, nicht ersetzte) Button-Objekt wird bei erfolgten Neuzeichen, z.B. durch Selektion der Zeile, als String dargestellt, weil das jetzt die neue Column-Class ist
 

André Uhres

Top Contributor
Hallo Arekai,

versuch's mal mit ButtonColumn.java. Beispiel:
Java:
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;

public class TestingTable {

    private final JTable table;
    private final JFrame frame;

    public TestingTable() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        table = new JTable(4, 4);
        for (int row = 0; row < table.getRowCount(); row++) {
            table.setValueAt("Save", row, 3);
            
        }
        frame.add(new JScrollPane(table));
        Action save = new AbstractAction() {

            @Override
            public void actionPerformed(final ActionEvent e) {
                JTable table = (JTable) e.getSource();
                int modelRow = Integer.valueOf(e.getActionCommand());
                JOptionPane.showMessageDialog(frame, "Saving row " + modelRow);
            }
        };
        ButtonColumn buttonColumn = new ButtonColumn(table, save, 3);
        buttonColumn.setMnemonic(KeyEvent.VK_S);
        frame.setVisible(true);
    }

    public static void main(final String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                TestingTable test = new TestingTable();
            }
        });
    }
}
Siehe auch Table Button Column Java Tips

Gruß,
André
 

Arekai

Mitglied
Zum Problem:
Eine (evtl. auch die) Ursache, dass die Buttons verschwinden liegt darin, dass die
Code:
getCellEditorValue()
des Editors einen String zurück gibt. Der Rückgabewert dieser Methode wird in das TableModel geschrieben. D.h. an der Stelle des Models an der vorher ein JButton war, steht jetzt ein String. Damit wird für diese Zelle nicht mehr der DefaultRenderer/Editor für JButton.class sondern für String.class verwendet. Was dazu führt, dass im Renderer zunächst "Save" und bei nochmaligem Editieren "javax.swing.JButton..." angezeigt wird.

Stimmt.

sondern das (uneditierte, nicht ersetzte) Button-Objekt wird bei erfolgten Neuzeichen, z.B. durch Selektion der Zeile, als String dargestellt, weil das jetzt die neue Column-Class ist

Warum wird das aber beim Neuzeichnen nen String?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Warum wird das aber beim Neuzeichnen nen String?
Da wird nichts beim Neuzeichnen ein String. Du setzt da mit Deinem Editor einen String ins TableModel:
Code:
return text
text ist ja ein String!
Java:
	public Object getCellEditorValue() {
		if (isPushed) {
			System.out.println("Ehh~ Sugoi desu ne!");
		}
		isPushed = false;
		return text;
	}
 

Arekai

Mitglied
Ahh. Funkioniert jetzt wie gewollt.

Habs auch soweit verstanden wieso das nach dem Drücken nur kaputt ging wenn man auf den obersten Button klickt. Weil nur bei dem die ColumnClass[0,x] festgestellt und angewandt wird.

Danke. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N JButton in einer Row in einer JTable AWT, Swing, JavaFX & SWT 33
S Swing JButton mit ActionListener innerhalb einer JTable AWT, Swing, JavaFX & SWT 4
H Neue Instanz einer Klasse bei JButton-Klick AWT, Swing, JavaFX & SWT 5
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
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable 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
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
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