gpt4 book ai didi

java - 如何使 JTable 单元格中的 JButton 可点击?

转载 作者:太空狗 更新时间:2023-10-29 22:46:11 25 4
gpt4 key购买 nike

我有一个带有自定义单元格渲染器的 JTable。该单元格是一个包含 JTextField 和 JButton 的 JPanel。 JTextField 包含一个整数,当用户单击 JButton 时,该整数应该增加。

问题是当我将 JButton 放在 JTable 单元格中时无法单击它。我怎样才能让它可以点击?

enter image description here

这是我的测试代码:

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

最佳答案

这是使用 ButtonColumn 的一种方法.

public class TableTest extends JFrame {

public TableTest() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTable table = new JTable(new TestModel());
table.getColumnModel().getColumn(1).setPreferredWidth(3);
table.getColumnModel().getColumn(2).setPreferredWidth(3);
this.add(new JScrollPane(table));
Action increase = new AbstractAction("+") {

@Override
public void actionPerformed(ActionEvent e) {
JTable table = (JTable) e.getSource();
int row = Integer.valueOf(e.getActionCommand());
TestModel model = (TestModel) table.getModel();
model.increment(row, 0);
}
};
ButtonColumn inc = new ButtonColumn(table, increase, 1);
Action decrease = new AbstractAction("-") {

@Override
public void actionPerformed(ActionEvent e) {
JTable table = (JTable) e.getSource();
int row = Integer.valueOf(e.getActionCommand());
TestModel model = (TestModel) table.getModel();
model.decrement(row, 0);
}
};
ButtonColumn dec = new ButtonColumn(table, decrease, 2);
pack();
}

public static void main(String[] args) {
new TableTest().setVisible(true);
}
}

class TestModel extends AbstractTableModel {

List<TestRecord> records = new LinkedList<TestRecord>();

private static class TestRecord {

private int val = 0;
}

public void increment(int row, int col) {
records.get(row).val++;
fireTableCellUpdated(row, 0);
}

public void decrement(int row, int col) {
records.get(row).val--;
fireTableCellUpdated(row, 0);
}

public TestModel() {
records.add(new TestRecord());
records.add(new TestRecord());
}

@Override
public Class<?> getColumnClass(int col) {
if (col == 0) {
return Integer.class;
} else {
return ButtonColumn.class;
}
}

@Override
public boolean isCellEditable(int row, int col) {
return true;
}

@Override
public int getColumnCount() {
return 3;
}

@Override
public int getRowCount() {
return records.size();
}

@Override
public Object getValueAt(int row, int col) {
if (col == 0) {
return records.get(row).val;
} else if (col == 1) {
return "+";
} else {
return "-";
}
}
}

关于java - 如何使 JTable 单元格中的 JButton 可点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5555938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com