java-填充JTable不会更改所选单元格的内容,并且会调用该单元格上的编辑;我该如何解决?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java-填充JTable不会更改所选单元格的内容,并且会调用该单元格上的编辑;我该如何解决?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3182字,纯文字阅读大概需要5分钟。
内容图文
![java-填充JTable不会更改所选单元格的内容,并且会调用该单元格上的编辑;我该如何解决?](/upload/InfoBanner/zyjiaocheng/655/00516f6092d04d17836a504391d786cf.jpg)
我有一个使用JTables显示数据的应用程序,并且单元格是可编辑的,以便用户可以更改数据.用户还可以还原更改,或从外部源加载数据.但是,如果用户使用键盘快捷键还原/加载数据,以使鼠标焦点不会从表中移开,则当前选定的单元格不会还原.实际上,刷新后,该单元进入编辑模式!然后,当用户离开此单元格导航时,将触发更改事件,因此旧值将被提交回数据存储.
我有一个简短的示例程序来演示此问题.它显示了一个表格,其中每个单元格的值均为0.还有一个“文件”菜单,其中包含一个名为“增量”的菜单项,该菜单项的键盘快捷键为Ctrl-I.每次调用Increment命令时,它都会增加所有单元格中显示的数字.要查看该问题,请执行以下操作:
>编译并运行程序
>多次按Ctrl-I调用“增量”命令.请注意,单元格值每次都会增加.
>单击一个单元格.
>多次按Ctrl-I调用“增量”命令.请注意,所有单元格值都会增加,但所选的值除外.
我尝试了各种方法来刷新表之前从表中删除选择,但无济于事.都没有
table.editCellAt(-1, -1);
也不
table.getSelectionModel().clearSelection();
例如,工作.
这是示例程序:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class TableBug extends JFrame {
private static final int ROW_COUNT = 3;
private static final int COL_COUNT = 3;
private int mDataValue = 0;
private DefaultTableModel mTableModel;
// Constructor
public TableBug() {
setTitle("TableBug");
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
// Create table model and table
mTableModel = new DefaultTableModel();
for (int col = 0; col < COL_COUNT; col++) {
mTableModel.addColumn("Value");
}
JTable table = new JTable(mTableModel);
setUpTable(table);
refresh();
// Create menu bar
int keyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
JMenu fileMenu = new JMenu("File");
JMenuItem incrementMenuItem = new JMenuItem("Increment");
incrementMenuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I, keyMask));
incrementMenuItem.addActionListener(new AbstractAction() {
public void actionPerformed(ActionEvent e) {
doIncrement();
}
});
fileMenu.add(incrementMenuItem);
JMenuBar mainMenuBar = new JMenuBar();
mainMenuBar.add(fileMenu);
// Populate GUI
setJMenuBar(mainMenuBar);
add(new JScrollPane(table), BorderLayout.CENTER);
// Display window
pack();
setVisible(true);
}
// Configures the table
private void setUpTable(JTable table) {
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.getTableHeader().setReorderingAllowed(false);
table.getTableHeader().setResizingAllowed(false);
table.setRowSelectionAllowed(false);
}
// Populates the table
private void refresh() {
mTableModel.setRowCount(ROW_COUNT);
for (int col = 0; col < COL_COUNT; col++) {
for (int row = 0; row < ROW_COUNT; row++) {
mTableModel.setValueAt(mDataValue, row, col);
}
}
}
// Handles the Increment menu item
public void doIncrement() {
mDataValue++;
refresh();
}
// Main program
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
new TableBug();
}
});
}
}
解决方法:
在刷新功能中,检查表是否正在编辑.如果是这样,获取正在编辑的行和列,然后停止单元格编辑.
private void refresh() {
if (table.isEditing()) {
int row = table.getEditingRow();
int column = table.getEditingColumn();
table.getCellEditor(row, column).stopCellEditing();
}
...
为此,您需要使表变量可访问(使其成为类变量).
内容总结
以上是互联网集市为您收集整理的java-填充JTable不会更改所选单元格的内容,并且会调用该单元格上的编辑;我该如何解决?全部内容,希望文章能够帮你解决java-填充JTable不会更改所选单元格的内容,并且会调用该单元格上的编辑;我该如何解决?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。