2009-09-25 22 views

Respuesta

32

No lo agrega a una fila; lo agrega a la celda. This tutorial describe lo que necesita.

+2

bien, gracias Droidln.net –

+7

No hay necesidad de agradecer, simplemente marque la marca :) – Bostone

+2

waw! Acabo de abrir ese ejemplo y me di cuenta de que el código fuente agregaba una "nueva JCheckbox" al CellEditor. Pero en realidad se representa como JButton. De todos modos, mi pregunta es, ¿por qué deberíamos poner JCheckBox en eso? :( – gumuruh

20

Puede agregar Component como una celda de tabla.

En primer lugar, debe implementar una clase que tenga JButton como clase principal y dos interfaces que TableCellRenderer y TableCellEditor.

La razón por la que debería implementar TableCellEditor es para recibir ActionEvent del botón.

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; 
    } 
} 

Luego, agregué un EventListener llamado TableButtonListener para manejar el evento del botón de la siguiente manera.

public interface TableButtonListener extends EventListener { 
    public void tableButtonClicked(int row, int col); 
} 

Y use anteriormente 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 desea mostrar la etiqueta del botón diferente para cada fila, se debe colocar el bloque de código en el getTableCellRendererComponent y getTableCellEditorComponent que es modificar la etiqueta del botón.

editar: El código compila ahora. Error de horquillado en el constructor de TableButton corregido.

+0

Gracias xrath por ayuda –

+3

-1 esta es una implementación ilegal de CellEditor: por contrato, debe notificar a CellEditorListeners registrados. Lo que trivialmente no funciona con la implementación vacía de addEditorListener ;-) Los supercontratos _deben_ ser atendidos por implementaciones, de ninguna manera. – kleopatra

+1

Lo probé y obtuve .... variable indefinida 'oyente' ... ¿qué es eso? :( – gumuruh

Cuestiones relacionadas