【发布时间】:2018-03-29 04:31:28
【问题描述】:
我想为 JTable 提供多单元格编辑功能:双击仍将编辑选定单元格中的值(标准行为),而右键单击应打开一个弹出菜单,其中包含“编辑选定单元格”条目”。
当用户点击此菜单项时,所选范围内的最后一个单元格变为可编辑。其他选定的单元格保持选中状态。然后他们写入新值,当编辑完成时(通常按 Enter 键),所有选定的单元格都会得到这个值。
为简单起见,我们假设所有单元格都包含相同的值类型,例如整数。
这是显示弹出对话框的代码,开始:
table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
table.setCellSelectionEnabled(true);
table.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
doPop(e);
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
doPop(e);
}
}
private void doPop(MouseEvent e) {
MultiEditPopUp menu = new MultiEditPopUp(tblRanges);
menu.show(e.getComponent(), e.getX(), e.getY());
}
});
class MultiEditPopUp extends JPopupMenu {
JMenuItem menuItem;
MultiEditPopUp(JTable table) {
menuItem = new JMenuItem("Edit selected");
menuItem.setAction(new BulkEditAction(table));
add(menuItem);
}
}
class BulkEditAction extends AbstractAction {
private final JTable table;
public BulkEditAction(JTable table) {
this.table = table;
}
@Override
public void actionPerformed(ActionEvent actionEvent) {
// TODO: let the user edit the last cell, and then apply to the others
}
}
我怎么能做这样的事?
【问题讨论】:
-
到底是什么问题?收到编辑后的值时,将其传播到所有选定的单元格并开心:-)
-
几个 cmets(与我没有得到的问题无关 ;-) a)不要子类化任何 JSomething,而是使用它们(JPopupMenu 旨在添加操作/项目,没有需要子类化只是为了添加一个特定的项目)b)总是使用最高的抽象,这里可用,这意味着 setComponentPopupMenu 而不是 mouseListener (无论如何,它提供了不完整的功能,因为它不包括键盘弹出窗口)
-
问题是现在如何让用户编辑该单元格,同时保持选择。感谢您对子类化的建议。