Timmos
Legacy Member
Hallo,
Een JButton in een JTable gaat niet, is niet default ondersteund door Java. Daarvoor moet je een TableCellRenderer implementeren en een AbstractTableModel uitbreiden door de methode "public Class getColumnClass(int column)" te overschrijven en de juist klasse (bvb JButton.class) terug te geven voor de juist kolom.
Probleem is dat mijn JButton niet reageren, maar geen nood want eigenlijk was mijn uitleg nog niet volledig. Omdat een JTable zijn mouse-events niet doorspeeld naar zijn componenten (in mijn geval: JButtons), moet je dat zelf voorzien. Ik heb dit alles gevonden door te zoeken op internet en dit is de methode die een muisevent doorgeeft naar een JButton:
En nu mijn écht probleem: dit werkt niet
Hij roept deze methode nochtans elke keer op als ik klik, hij geeft ook de juiste coordinaten weer in mijn tabel, hij heeft de juiste knop te pakken. Het probleem is dus dat de knop visueel niet wijzigt, ook al wordt table.repaint() aangeroepen.
Voorlopig los ik het expliciet op door dit te schrijven (waarbij de bovenstaande methode enkel wordt opgeroepen door een "mousePressed(MouseEvent e)" en een "mouseReleased(MouseEvent e)", anders zou de knop worden ingedrukt als je erover gaat met de muis):
Maar dit vind ik allesbehalve optimaal aangezien je zaken die een JButton zelf moet afhandelen, van buitenaf regelt.
Kent iemand dit probleem, waar je dus een Component in een JTable wilt plaatsen? (Component is verschillend van JLabel en JCheckBox, want die zijn default ondersteund)
Alvast bedankt, het zou een grote hulp zijn
Een JButton in een JTable gaat niet, is niet default ondersteund door Java. Daarvoor moet je een TableCellRenderer implementeren en een AbstractTableModel uitbreiden door de methode "public Class getColumnClass(int column)" te overschrijven en de juist klasse (bvb JButton.class) terug te geven voor de juist kolom.
Probleem is dat mijn JButton niet reageren, maar geen nood want eigenlijk was mijn uitleg nog niet volledig. Omdat een JTable zijn mouse-events niet doorspeeld naar zijn componenten (in mijn geval: JButtons), moet je dat zelf voorzien. Ik heb dit alles gevonden door te zoeken op internet en dit is de methode die een muisevent doorgeeft naar een JButton:
Code:
private void forwardClickEventToButton(MouseEvent e) {
TableColumnModel columnModel = table.getColumnModel();
int column = columnModel.getColumnIndexAtX(e.getX());
int row = e.getY() / table.getRowHeight();
Object value;
JButton button;
MouseEvent buttonEvent;
if (row >= table.getRowCount() || row < 0 ||
column >= table.getColumnCount() || column < 0) {
return;
}
value = table.getValueAt(row, column);
if (!(value instanceof JButton)) {
return;
}
button = (JButton) value;
buttonEvent =
(MouseEvent) SwingUtilities.convertMouseEvent(table, e, button);
button.dispatchEvent(buttonEvent);
// This is necessary so that when a button is pressed and released
// it gets rendered properly. Otherwise, the button may still appear
// pressed down when it has been released.
table.repaint();
}
Hij roept deze methode nochtans elke keer op als ik klik, hij geeft ook de juiste coordinaten weer in mijn tabel, hij heeft de juiste knop te pakken. Het probleem is dus dat de knop visueel niet wijzigt, ook al wordt table.repaint() aangeroepen.Voorlopig los ik het expliciet op door dit te schrijven (waarbij de bovenstaande methode enkel wordt opgeroepen door een "mousePressed(MouseEvent e)" en een "mouseReleased(MouseEvent e)", anders zou de knop worden ingedrukt als je erover gaat met de muis):
Code:
button.setSelected(!button.isSelected()); // wijzig de drukstand van de knop
if (!button.isSelected()) // als hij niet langer geselecteerd is ...
button.doClick(); // ... voer dan de actie uit die aan deze knop hangt.
Maar dit vind ik allesbehalve optimaal aangezien je zaken die een JButton zelf moet afhandelen, van buitenaf regelt.
Kent iemand dit probleem, waar je dus een Component in een JTable wilt plaatsen? (Component is verschillend van JLabel en JCheckBox, want die zijn default ondersteund)
Alvast bedankt, het zou een grote hulp zijn

