gpt4 book ai didi

java - Swing JTable 中的多单元格选择

转载 作者:行者123 更新时间:2023-12-02 08:07:39 26 4
gpt4 key购买 nike

我想为 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
}
}

我怎样才能做这样的事情?

最佳答案

还是不太确定问题出在哪里。基本方法是

  • 存储选定的单元格
  • 让用户编辑其中之一
  • 最后,获取编辑后的值并将其设置为之前存储的所有单元格

我看到的唯一棘手的部分可能是“最后”检测(因为编辑的生命周期没有明确定义)。一些代码片段

public class BulkEditAction extends AbstractAction {
JTable table;
List selectedCells;

public BulkEditAction(JTable table) {
this.table = table;
}

@Override
public void actionPerformed(ActionEvent actionEvent) {

// store, here rows only, refine for cell selection
selectedCells = Arrays.asList(table.getSelectedRows());
final int rowToEdit = // ...
final int columnToEdit = // ...
table.editCellAt(rowToEdit, columnToEdit);
CellEditorListener l = new CellEditorListener() {

@Override
public void editingStopped(ChangeEvent e) {
((AbstractCellEditor) e.getSource()).removeCellEditorListener(this);
propagateEditedValue(rowToEdit, columnToEdit);

}

@Override
public void editingCanceled(ChangeEvent e) {
((AbstractCellEditor) e.getSource()).removeCellEditorListener(this);
}
};
table.getCellEditor().addCellEditorListener(l);
}

private void propagateEditedValue(final int row, final int column) {
// need to invoke to be sure that the table has updated itself after
// editingStopped
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// foreach selectedCell (with coordinates selectedRow/-column
table.setValueAt(table.getValueAt(row, column), selectedRow, selectedColumn);
}
});
}
}

关于java - Swing JTable 中的多单元格选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900100/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com