java jtable选择行事件_java-JTable中行选择的受控编辑

本文探讨如何在Java的JTable组件中控制行选择和单元格编辑。目标是在用户编辑表格时,阻止选择其他行,直到当前行编辑完成。作者分享了尝试使用valueChanged方法以及自定义单元格编辑器的代码片段,讨论了如何在编辑结束后将更改写入数据库,并提供了相关代码示例。最后,建议通过向模型注册TableModelListener来监听并处理数据变化。
摘要由CSDN通过智能技术生成

我有一个JTable,显示来自SQL数据库的行.该表相对较小(仅4列,最多1000行).

我想让用户有机会编辑表中的任何单元格,但要避免过多地限制它,以便他们必须使用编辑对话框(这使错误检查和验证容易得多,但不太直观)

我尝试了几种使用JTable的valueChanged方法控制编辑选择的方法,但是运气不佳.

我希望在编辑结束时对每一行进行编辑并将其写入数据库.我希望一旦单击一个单元格以开始对该行的编辑,就无法选择其他行,直到用户完成对该行的编辑为止(其他行显示为灰色).编辑每个单元格并按Enter后,编辑选择应跳到同一行的下一列.

谁能指出我该如何实现?

// Create table with database data

table = new JTable(new DefaultTableModel(data, columnNames)) {

public Class getColumnClass(int column) {

for (int row = 0; row < getRowCount(); row++) {

Object o = getValueAt(row, column);

if (o != null){

return o.getClass();

}

}

return Object.class;

}

@Override

public boolean isCellEditable(int row, int col){

return true;

}

@Override

public boolean editCellAt(int row, int column) {

boolean ans = super.editCellAt(row, column);

if (ans) {

Component editor = table.getEditorComponent();

editor.requestFocusInWindow();

}

return ans;

}

@Override

public void valueChanged(ListSelectionEvent source) {

super.valueChanged(source);

if (table!=null)

table.changeSelection(getSelectedRow(), getSelectedColumn()+1, false, false);

}

};

编辑-具有表指针的自定义单元格编辑器似乎是一个开始

public class ExchangeTableCellEditor extends AbstractCellEditor implements TableCellEditor {

private JTable table;

JComponent component = new JTextField();

public ExchangeTableCellEditor(JTable table) {

this.table = table;

}

public boolean stopCellEditing() {

boolean ans = super.stopCellEditing();

//now we want to increment the cell count

table.editCellAt(table.getSelectedRow(), table.getSelectedColumn()+1);

return ans;

}

@Override

public void cancelCellEditing() {

//do nothing... must accept cell changes

}

@Override

public Object getCellEditorValue() {

return ((JTextField)component).getText();

}

@Override

public Component getTableCellEditorComponent(JTable arg0, Object value,

boolean arg2, int arg3, int arg4) {

((JTextField)component).setText((String)value);

return component;

}

}

解决方法:

附录:我不熟悉您的片段中显示的方法.相反,如下所示,向您的模型注册一个TableModelListener,并使用保证的粒度更新数据库.另请参见How to Use Tables: Listening for Data Changes.

附录:@kleopatra关于您的TableCellEditor是正确的.通知侦听器的一种便捷方法是调用超级实现,如here所示.请注意,委托调用fireEditingStopped().

/** @see https://stackoverflow.com/questions/9155596 */

public class NewJavaGUI extends JPanel {

private final JTable table;

public NewJavaGUI() {

String[] colNames = {"C1", "C2", "C3"};

DefaultTableModel model = new DefaultTableModel(colNames, 0) {

@Override

public boolean isCellEditable(int row, int col) {

// return your actual criteria

return true;

}

@Override

public Class getColumnClass(int col) {

// return your actual type tokens

return getValueAt(0, col).getClass();

}

};

// Add data; note auto-boxing

model.addRow(new Object[]{"A1", "A2", 42});

model.addRow(new Object[]{"B1", "B2", 42d});

model.addTableModelListener(new TableModelListener() {

@Override

public void tableChanged(TableModelEvent e) {

// DML as indicated

}

});

table = new JTable(model);

this.add(table);

}

private void display() {

JFrame f = new JFrame("NewJavaGUI");

f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

f.add(this);

f.pack();

f.setLocationRelativeTo(null);

f.setVisible(true);

}

public static void main(String[] args) {

EventQueue.invokeLater(new Runnable() {

@Override

public void run() {

new NewJavaGUI().display();

}

});

}

}

标签:swing,jtable,java

来源: https://codeday.me/bug/20191201/2083328.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值