Comment faire un clic sur JButton dans une cellule JTable?
J'ai une JTable avec un rendu de cellule personnalisé. La cellule est un Composite qui contient un component swing jtextfield et un JButton. Le component swing jtextfield contient un entier, et lorsque l'utilisateur clique sur le JButton l'entier devrait être augmenté.
Le problème est que le JButton ne peut pas être activé lorsque je l'ai dans un JTable cellule. Comment puis-je le faire sur-mesure?
Voici mon code de test:
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;
}
}
}
source d'informationauteur Jonas
Vous devez vous connecter pour publier un commentaire.
Voici une façon d'utiliser
ButtonColumn
.J'ai basé mon dernier exemple sur le code fourni par mKrobels réponse à Comment mettre en œuvre dynamique de l'interface graphique en swing
La principale différence entre lui et mon exemple dans la question, c'est qu'il utiliser
DefaultTableModel
et j'utiliseAbstractTableModel
. Son exemple fonctionne, mais pas le mien.La solution que j'ai trouvé c'est que j'ai eu à mettre en œuvre
isCellEditable()
dans le TableModel, donc, avec cette méthode ajouté, mon exemple de travaux:Le rendu est juste un affichage pour la peinture de la cellules. Vous avez besoin d'un composant de l'éditeur qui vous permet de faire des changements.
Prendre un coup d'oeil à:
http://download.oracle.com/javase/6/docs/api/javax/swing/table/TableCellEditor.html