JTable停止单元格编辑,无需用户单击
我试图解决我的程序中的一个奇怪问题。 该程序创建一系列GUI和JTable,使用户能够生成XML文件。 其中一个表格用于创建“语句”。 除了说数据存储在多个二维数组中并存储在哈希映射中之外,我不会详细讨论。
这是发生了什么。 当用户进入声明屏幕时,使用2D阵列中的内容生成JTable。 这些数据填充用户可以修改的单元格。 其中一个细胞(也是最重要的)是数量。 他们为这些行设置的金额与另一个类的金额匹配很多。
表格底部是一个“完成”按钮。 当用户点击这个按钮时,逻辑将检查钱数是否匹配。 如果他们这样做,那么程序将用任何更改的值更新2D数组并处理JTable。
我的问题是,一旦用户更新一个单元格并点击“完成”,最后的更新不起作用。 基本上用户必须先点击表格中的其他地方然后点击完成。 我希望这个动作自动发生,这样当用户点击“完成”时,单元格编辑就会停止。 这里是完成的按钮的代码:
finishedButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ae){
//Creates another table model for the finished button logic.
DefaultTableModel dm = (DefaultTableModel)StatementGUI.tbl.getModel();
//Gets the total number of table rows.
int rows = dm.getRowCount();
//Creates a variable to store the statement transaction total.
double statementTransactionTotal=0;
//For each row in the table.
for(int i = 0; i < dm.getRowCount(); i++){
//Gets the total of all transactions in the table.
String currentTotal = tbl.getValueAt(i, 3).toString();
Double currentTotalDouble = Double.parseDouble(currentTotal);
statementTransactionTotal=statementTransactionTotal+currentTotalDouble;
}
//Creates a decimal format and applies the statement total.
DecimalFormat df = new DecimalFormat("0.00");
String currentTotalDF = df.format(statementTransactionTotal);
//Stops editing on the table so that the data can be used.
if(null != tbl.getCellEditor()){
tbl.getCellEditor().stopCellEditing();
}
//If the statement total matches the transaction total..
if(currentTotalDF.matches(ClearedMainGUI.currentTransactionAmount)){
//For each row in the table..
for(int i = 0; i < dm.getRowCount(); i++){
//Will replace the hash/array value with the table value.
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][0]=tbl.getValueAt(i, 0).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][1]=tbl.getValueAt(i, 1).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][2]=tbl.getValueAt(i, 2).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][3]=tbl.getValueAt(i, 3).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][4]=tbl.getValueAt(i, 4).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][5]=tbl.getValueAt(i, 5).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][6]=tbl.getValueAt(i, 6).toString();
ClearedMainGUI.Transactions.get(ClearedMainGUI.selectedRow)[i][7]=tbl.getValueAt(i, 7).toString();
}
//For each row in the table..
for(int i = rows - 1; i >=0; i--){
//Removes the current row so the table will be empty next time.
dm.removeRow(i);
}
//Removes the frame and goes back to the previous GUI.
frame.dispose();
//If the statement total and transaction total do not match..
}else{
JOptionPane.showMessageDialog(null, "The statement total entered: $"+statementTransactionTotal+" " +
"does not match the transaction total of: $"+ClearedMainGUI.currentTransactionAmount);
}
}
});
我认为我的问题在于这一行:
if(null != tbl.getCellEditor()){
tbl.getCellEditor().stopCellEditing();
}
这似乎只在用户编辑单元格后点击了表格的另一个区域后才起作用。
我感谢帮助!
我的问题是,一旦用户更新一个单元格并点击“完成”,最后的更新不起作用。
退出表停止编辑两种方法:
你可以:
将代码添加到ActionListener:
if (table.isEditing())
table.getCellEditor().stopCellEditing();
或者在桌子上设置一个属性:
JTable table = new JTable(...);
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
编辑:
当用户单击完成时,所有单元格数据将保存到二维数组中。
为什么? 所有的数据已经存储在TableModel中。
在任何情况下,您需要停止编辑之前,您尝试将数据从TableModel复制到阵列。
链接地址: http://www.djcxy.com/p/48825.html