Archief - [PROG][JAVA] JButton in een JTable

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

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:
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();
                
            }
En nu mijn écht probleem: dit werkt niet :p 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 :)

Timmos

Legacy Member
Mhm, ik heb nog wat verder gezocht (geloof me, ik heb al veel dingen doorlezen :p) en ik denk dat ik juist een perfecte thread gevonden heb voor mijn probleem: JButton is not clickable in JTable

Blijkbaar moet je dus ook een TableCellEditor gebruiken! Direct eens proberen.

Timmos

Legacy Member
Ik heb het ondertussen perfect opgelost gekregen en alle venijnigheden (zoals het eerst moeten selecteren van een rij om daarna pas op een knop te kunnen klikken) eruit gekregen. Het is echt chic nu!

Ik moet natuurlijk nog de rijen mooi opmaken en bvb zorgen dat de button-kolommen niet resizable zijn, maar da's allemaal rap te doen.

Hehe :D

Bavo aka Joske

Legacy Member
Heb behoorlijk wat crap moeten coden om een JCheckbox op een degelijke manier in mijn JideTable (extensie van JTable) te krijgen. Jezus.
Drie manieren om hetzelfde te doen waarvan geen enkele volledig werkt :)

Timmos

Legacy Member
Ik dacht dat een JCheckBox sowieso ondersteund is (voor Boolean's). Zo geldt ook voor String => JLabel. Ook JComboBox'en zijn ondersteund.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan