Wie man einen JButton in JTable Zelle anklicken kann?
Ich habe eine JTable mit ein benutzerdefinierter Zellen-renderer. Die Zelle ist ein JPanel enthält ein JTextField und ein JButton. Die JTextField enthält eine ganze Zahl, und wenn der Benutzer klickt auf den JButton die ganze Zahl sollte erhöht werden.
Das problem ist, dass der JButton kann nicht angeklickt werden, wenn ich es in einer JTable-Zelle. Wie kann ich es machen, das man anklicken kann?
Hier ist mein test-code:
public class ActiveTable extends JFrame {
public ActiveTable() {
RecordModel model = new RecordModel();
model.addRecord(new Record());
JTable table = new JTable(model);
EditorAndRenderer editorAndRenderer = new EditorAndRenderer();
table.setDefaultRenderer(Object.class, editorAndRenderer);
table.setDefaultEditor(Object.class, editorAndRenderer);
table.setRowHeight(38);
add(new JScrollPane(table));
setPreferredSize(new Dimension(600, 400));
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Active Table");
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new ActiveTable();
}
});
}
class RecordModel extends AbstractTableModel {
private final List<Record> records = new ArrayList<Record>();
@Override
public int getColumnCount() {
return 1;
}
@Override
public int getRowCount() {
return records.size();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return records.get(rowIndex);
}
public void addRecord(Record r) {
records.add(r);
fireTableRowsInserted(records.size()-1, records.size()-1);
}
}
class Record {
private int count = 1;
public int getCount() { return count; }
public void increase() { count = count + 1; }
}
class CellPanel extends JPanel {
private Record record;
private final JTextField field = new JTextField(8);
private final Action increaseAction = new AbstractAction("+") {
public void actionPerformed(ActionEvent e) {
record.increase();
field.setText(record.getCount()+"");
JTable table = (JTable) SwingUtilities.getAncestorOfClass(JTable.class, (Component) e.getSource());
table.getCellEditor().stopCellEditing();
}
};
private final JButton button = new JButton(increaseAction);
public CellPanel() {
add(field);
add(button);
}
public void setRecord(Record r) {
record = r;
field.setText(record.getCount()+"");
}
public Record getRecord() {
return record;
}
}
class EditorAndRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {
private final CellPanel renderer = new CellPanel();
private final CellPanel editor = new CellPanel();
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
renderer.setRecord((Record) value);
return renderer;
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column) {
editor.setRecord((Record) value);
return editor;
}
@Override
public Object getCellEditorValue() {
return editor.getRecord();
}
@Override
public boolean isCellEditable(EventObject ev) {
return true;
}
@Override
public boolean shouldSelectCell(EventObject ev) {
return false;
}
}
}
InformationsquelleAutor der Frage Jonas | 2011-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Möglichkeit zur Verwendung
ButtonColumn
.InformationsquelleAutor der Antwort trashgod
Ich basiert mein letztes Beispiel auf den code von mKrobels Antwort auf Wie implementieren Sie eine dynamische GUI in swing
Den wichtigsten Unterschied zwischen seinem und meinem Beispiel in der Frage ist, dass er
DefaultTableModel
und ich benutzeAbstractTableModel
. Sein Beispiel funktioniert, aber nicht von mir.Die Lösung, die ich fand, war, dass ich umzusetzen hatte
isCellEditable()
im TableModel, so dass mit dieser Methode Hinzugefügt, mein Beispiel funktioniert:InformationsquelleAutor der Antwort Jonas
Den renderer ist nur eine Anzeige für die Malerei der Zellen. Benötigen Sie eine editor-Komponente, die Ihnen ermöglicht, änderungen zu machen.
Werfen Sie einen Blick auf:
http://download.oracle.com/javase/6/docs/api/javax/swing/table/TableCellEditor.html
InformationsquelleAutor der Antwort jzd