反转 JTable 中的选择

发布于 2024-08-18 11:08:43 字数 74 浏览 5 评论 0原文

单击按钮时,我希望反转选定的行(应选择未选定的行,应不选择选定的行)。

JTable 中有内置方法可以做到这一点吗?

On clicking a button, I want the selected rows to be inverted (non-selected rows should be selected and selected rows should be non-selected).

Is there a build-in method in JTable to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

醉梦枕江山 2024-08-25 11:08:43

JTable 似乎没有内置的方法来执行此操作。所以我用下面的代码实现了它。 (希望这对面临类似问题的人有所帮助。)

int[] selectedIndexs = jtable.getSelectedRows();
jtable.selectAll();

for (int i = 0; i < jtable.getRowCount(); i++) {
    for (int selectedIndex : selectedIndexs) {
        if (selectedIndex == i) {
            jtable.removeRowSelectionInterval(i, i);
            break;
        }
    }
}

JTable doesn't seems to have a built-in way of doing this. So I implemented it with the following code. (Hope this is helpful for someone who is facing a similar issue.)

int[] selectedIndexs = jtable.getSelectedRows();
jtable.selectAll();

for (int i = 0; i < jtable.getRowCount(); i++) {
    for (int selectedIndex : selectedIndexs) {
        if (selectedIndex == i) {
            jtable.removeRowSelectionInterval(i, i);
            break;
        }
    }
}
生活了然无味 2024-08-25 11:08:43

简化 Sudar 的解决方案:

int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
    table.removeRowSelectionInterval(prevSel, prevSel);
}

To simplify Sudar's solution:

int[] selectedIndices = table.getSelectedRows();
table.selectAll();
for (int prevSel : selectedIndices) {
    table.removeRowSelectionInterval(prevSel, prevSel);
}
彼岸花似海 2024-08-25 11:08:43

JTable没有这个功能

JTable does not have that feature

对风讲故事 2024-08-25 11:08:43

不,您必须实现一个cutsom ListSelectionListener

No, You will have to implement a cutsom ListSelectionListener

起风了 2024-08-25 11:08:43

对上面的改进是使用选择模型对象而不是表对象来更新选择。当您通过表更新选择时,每次更新都会触发一个选择更改事件,并且更新只有几百行的表需要几秒钟的时间。

对于超过几百行的表,最快的方法是这样的

/**
 * Invert selection in a JTable.
 *
 * @param table
 */
public static void invertSelection(JTable table) {
    ListSelectionModel mdl = table.getSelectionModel();
    int[] selected = table.getSelectedRows();
    mdl.setValueIsAdjusting(true);
    mdl.setSelectionInterval(0, table.getRowCount() - 1);
    for (int i : selected) {
        mdl.removeSelectionInterval(i, i);
    }
    mdl.setValueIsAdjusting(false);
}

A refinement to above is to update selection using the selection model object, not the table object. When you update the selection via the table, each update fires a selection change event and it takes few seconds to update a table with just a few hundred rows.

The fastest way for tables with more than few hundred rows is this

/**
 * Invert selection in a JTable.
 *
 * @param table
 */
public static void invertSelection(JTable table) {
    ListSelectionModel mdl = table.getSelectionModel();
    int[] selected = table.getSelectedRows();
    mdl.setValueIsAdjusting(true);
    mdl.setSelectionInterval(0, table.getRowCount() - 1);
    for (int i : selected) {
        mdl.removeSelectionInterval(i, i);
    }
    mdl.setValueIsAdjusting(false);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文