J'ai créé une interface graphique swing avec JTable avec des lignes et des colonnes. Comment ajouter un bouton à une ligne dans une JTable?
Vous ne l'ajoutez pas à une ligne - vous l'ajoutez à la cellule. Ce tutoriel décrit ce dont vous avez besoin.
Vous pouvez ajouter un composant en tant que cellule de tableau.
Tout d'abord, vous devez implémenter une classe qui a JButton comme classe parent et deux interfaces que TableCellRenderer et TableCellEditor.
La raison qui devrait implémenter TableCellEditor est de recevoir ActionEvent du bouton.
public class TableButton extends JButton implements TableCellRenderer, TableCellEditor {
private int selectedRow;
private int selectedColumn;
Vector<TableButtonListener> listener;
public TableButton(String text) {
super(text);
listener = new Vector<TableButtonListener>();
addActionListener(new ActionListener() {
public void actionPerformed( ActionEvent e ) {
for(TableButtonListener l : listener) {
l.tableButtonClicked(selectedRow, selectedColumn);
}
}
});
}
public void addTableButtonListener( TableButtonListener l ) {
listener.add(l);
}
public void removeTableButtonListener( TableButtonListener l ) {
listener.remove(l);
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int col) {
return this;
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int col) {
selectedRow = row;
selectedColumn = col;
return this;
}
@Override
public void addCellEditorListener(CellEditorListener arg0) {
}
@Override
public void cancelCellEditing() {
}
@Override
public Object getCellEditorValue() {
return "";
}
@Override
public boolean isCellEditable(EventObject arg0) {
return true;
}
@Override
public void removeCellEditorListener(CellEditorListener arg0) {
}
@Override
public boolean shouldSelectCell(EventObject arg0) {
return true;
}
@Override
public boolean stopCellEditing() {
return true;
}
}
Ensuite, j'ai ajouté un EventListener nommé TableButtonListener pour gérer l'événement de bouton comme suit.
public interface TableButtonListener extends EventListener {
public void tableButtonClicked( int row, int col );
}
Et utilisez ci-dessus Renderer/Editor.
TableButton buttonEditor = new TableButton("Button");
buttonEditor.addButtonListener(new TableButtonListener() {
@Override
public void tableButtonClicked(int row, int col) {
// do something
}
});
TableColumn col = new TableColumn(1, 80);
col.setCellRenderer(buttonEditor);
col.setCellEditor(buttonEditor);
cols.addColumn(colPattern);
Si vous souhaitez afficher une étiquette de bouton différente pour chaque ligne, vous devez insérer un bloc de code dans getTableCellRendererComponent et getTableCellEditorComponent qui doit modifier l'étiquette de bouton.
modifier: le code se compile maintenant. Erreur de parenthèse dans le constructeur TableButton corrigée.
Colonne des boutons du tablea donne une approche.