web-dev-qa-db-fra.com

Comment ajouter un bouton dans une ligne de JTable dans Swing java

J'ai créé une interface graphique swing avec JTable avec des lignes et des colonnes. Comment ajouter un bouton à une ligne dans une JTable?

26
om.

Vous ne l'ajoutez pas à une ligne - vous l'ajoutez à la cellule. Ce tutoriel décrit ce dont vous avez besoin.

34
Bostone

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.

20
xrath

Colonne des boutons du tablea donne une approche.

8
camickr