gpt4 book ai didi

java - 右键单击多项选择和 JPopupMenu

转载 作者:行者123 更新时间:2023-12-02 00:32:15 27 4
gpt4 key购买 nike

我在 JTable 上的弹出菜单以及该 JTable 允许多个间隔选择这一事实上遇到问题。我将详细解释我的情况,希望尽可能清楚。

我有一个基本数据类,我们称之为 Item,带有一个字符串 id(名称)和两个 boolean 字段,onlineactive (带有相对的 getter)。
JTable 背后的想法是,对于数据集中的每个项目,它将在第一列中显示其名称,在第二列中显示其状态,其中“状态”我的意思是,它将显示“ACTIVE/NOT ACTIVE”如果该项目在线,否则将显示“离线”。我已经实现了一个 TableModel 来完成这项工作并且它有效。

我还希望,当用户右键单击一行时,会出现一个弹出窗口(如果所选项目处于在线状态),允许根据其状态激活/停用该项目。只要选择模型是单次选择,这种方法就可以完美工作,但是当我将其更改为多间隔选择时,我无法再使其正常工作。

我想要的行为是,右键单击时,执行单击的位置会出现一个弹出窗口,该行将添加到选择中并突出显示,并且所有先前选择的行保持选中状态!这是我做不到的!

这是我在 MouseListener 中的代码:

tblModel.addMouseListener(new MouseAdapter() {
void showPopup(MouseEvent e){
int r = tblModel.rowAtPoint(e.getPoint());
if (r >= 0 && r < tblModel.getRowCount()) {
//tblModel.setRowSelectionInterval(r, r);
} else {
tblModel.clearSelection();
}
int[] viewRowIndexes = tblModel.getSelectedRows();
int rowViewIndex = tblModel.getSelectedRow();

if (rowViewIndex < 0)
return;

int rowModelIndex = tblModel.convertRowIndexToModel(rowViewIndex);
if (e.isPopupTrigger() && e.getComponent() instanceof JTable) {
Action changeActiveAction;
Action changeInactiveAction;
List<String> actives = new ArrayList<String>();
List<String> inactives = new ArrayList<String>();
DefaultListSelectionModel selectionModel = (DefaultListSelectionModel) tblModel.getSelectionModel();

for (int viewRowIndex : viewRowIndexes) {
int modelRowIndex = tblModel.convertRowIndexToModel(viewRowIndex);
if (selectionModel.isSelectedIndex(viewRowIndex)) {
boolean online = ((MyTableModel) tblModel.getModel()).isItemOnline(modelRowIndex);
if (!online)
continue;

boolean active = ((MyTableModel) tblModel.getModel()).isItemActive(modelRowIndex);
String idItem = (String) ((MyTableModel) tblModel.getModel()).getValueAt(modelRowIndex,0);
if (active) {
actives.add(idItem);
} else {
inactives.add(idItem);
}
}
}

if (actives.size() > 0 || inactives.size() > 0) {
popup = new JPopupMenu();
if (actives.size() > 0) {
changeActiveAction = new ChangeAction("Deactivate ACTIVE Items","This will deactivate all the selected ACTIVE items",actives, false);
popup.add(new JMenuItem(changeActiveAction));
}
if (inactives.size() > 0) {
changeInactiveAction = new ChangeAction("Activate INACTIVE Items","This will activate all the selected INACTIVE items",inactives, true);
popup.add(new JMenuItem(changeInactiveAction));
}
popup.show(e.getComponent(), e.getX(),e.getY());
}
}
}
@Override
public void mousePressed(MouseEvent e) {
showPopup(e);
}

@Override
public void mouseReleased(MouseEvent e) {
showPopup(e);
}
};

该行为在功能上是正确的,但行选择不起作用。评论该行后

//tblModel.setRowSelectionInterval(r, r);

当我右键单击一行时,会出现一个弹出窗口,但它会忽略我单击的行。

另一方面,如果未注释,该行将仅选择单击的行,丢失所有其余的选择......

我很抱歉发了这么长的帖子,但我不知道如何在不提供我的情况的所有细节的情况下解释我的问题......希望这是一件微不足道的事情,您可以告诉我如何修复/更改它。

提前谢谢您。

最佳答案

答案的一部分是:

if (tblModel.isSelectedIndex(r)) {
tblModel.removeSelectionInterval(r, r);
} else {
tblModel.addSelectionInterval(r, r);
}

关于java - 右键单击多项选择和 JPopupMenu,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8714498/

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