JAVA SWING中,JTable表格的单元格编辑后未失焦,点击JFrame窗口右上角关闭按钮,数据保存错误,保存的数据还是未编辑之前的数据,最后加了个判断,就把问题解决了。直接看代码。
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class Demo {
public static void main(String[] args) {
JFrame frame = new JFrame();
final JTable table = new JTable();
DefaultTableModel model = new DefaultTableModel();
String[] columnIdentifiers = {"one", "two", "three"};//表头
String[][] data = new String[2][3];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
if(j == 2) {
continue;
}
if(j == 0) {
data[i][j] = "123";
}else {
data[i][j] = "asd";
}
}
}
model.setDataVector(data, columnIdentifiers);
table.setModel(model);
table.getColumnModel().getColumn(2).setCellRenderer(new TableCellRendererButton());
table.getColumnModel().getColumn(2).setCellEditor(new TableCellEditorButton());
JScrollPane scrollPane = new JScrollPane(table);
frame.add(scrollPane);
frame.setBounds(100, 100, 300, 200);
frame.setVisible(true);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
//当表格单元格编辑完后,没有失去焦点时,直接点击右上角关闭按钮,
//下面代码可以强制表格停止编辑。
if (table.getCellEditor() != null) {
//判断表格是否编辑,是的话就停止编辑。
table.getCellEditor().stopCellEditing();
}
int rows = table.getRowCount();
int columns = table.getColumnCount();
for (int i = 0; i < rows; i++) {
System.out.println();
for (int j = 0; j < columns; j++) {
System.out.print(table.getValueAt(i, j)+"-----------");
}
}
}
});
}
}
class TableCellRendererButton implements TableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
JButton button = new JButton("按钮");
return button;
}
}
class TableCellEditorButton extends DefaultCellEditor{
private JButton btn;
public TableCellEditorButton() {
super(new JTextField());
//设置点击一次就激活,否则默认好像是点击2次激活。
this.setClickCountToStart(1);
btn = new JButton("按钮");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮事件触发----");
}
});
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return btn;
}
}
注意其中的关键代码如下:
//当表格单元格编辑完后,没有失去焦点时,直接点击右上角关闭按钮,
//下面代码可以强制表格停止编辑。
if (table.getCellEditor() != null) {
//判断表格是否编辑,是的话就停止编辑。
table.getCellEditor().stopCellEditing();
}
运行后界面,如果我把第一行的asd改成66666,且不失焦,然后直接点击右上角关闭,如下:
最后控制台打印结果如下:
即使不失焦,依旧可以获得编辑后的值。