Java 仅允许在多个JLists上进行单个选择

Java 仅允许在多个JLists上进行单个选择,java,jlist,Java,Jlist,这是我关于stackoverflow的第一个问题。我会尽我最大的努力,以前做过很多研究,但都找不到答案 这是我的setip: 我在一个JPanel中有多个JLists 我的JFrame中有多个JPanel 例如: 一个JFrame有十二个JPanel,每个JPanel有两个Jlist 现在,考虑到组件的性质,我可以从每个JList中选择一项。由于每个组件都有多个JLists,因此我基本上可以选择多个条目(或者在多个JLists中选择一个条目) 我想要的是,在JFrame上,作为一个整体,只能

这是我关于stackoverflow的第一个问题。我会尽我最大的努力,以前做过很多研究,但都找不到答案

这是我的setip:

  • 我在一个JPanel中有多个JLists
  • 我的JFrame中有多个JPanel
例如:

一个JFrame有十二个JPanel,每个JPanel有两个Jlist

现在,考虑到组件的性质,我可以从每个JList中选择一项。由于每个组件都有多个JLists,因此我基本上可以选择多个条目(或者在多个JLists中选择一个条目)

我想要的是,在JFrame上,作为一个整体,只能选择一个项目。

有办法吗


非常感谢你的帮助

即使您的部分是动态的,您仍然可以迭代帧中的所有
JList
s。即使列表没有直接添加到
JFrame
,这也是正确的。然后,解决方案是创建一个迭代所有列表并对每个列表调用的列表,但触发选择事件的列表除外(可由
ListSelectionEvent.getSource()
确定)

以下是ListSelectionListener实现的大致外观:

@Override
void valueChanged(ListSelectionEvent e) {
    for (JPanel section : frame.getSections()) {
        for (JList list : section.getLists()) {
            if (list != e.getSource()) {
                list.clearSelection();
            }
        }
    }
}

要使其正常工作,侦听器必须向框架中的所有
JList
注册。由于列表可以动态更改,因此每当向框架中添加新列表时,您都需要调用。实现这一点的最简单方法取决于您的代码。希望您有某种
addSection
方法可以使用到,但如果所有其他操作都失败,则始终可以将节添加到放置在其中的任何容器中,并在将新节添加到容器时在组件层次结构中搜索列表。

我现在没有可用的IDE,或者我会发布一些示例代码

当您向自己添加JList时,JPanel将其添加到地图中,使用JList的名称作为键,JList本身就是值。然后,当您在任何JList上选择项目时,检查其键不是当前选定JList的地图,并将其所有选定索引更改为-1。使用JList的setSelectedIndex()

jlist1.setSelectedIndex(-1);

JLists的数量是动态的还是静态的UI?JLists的名称是唯一的吗?这是一个非常棘手的问题!节本身是动态的还是仅仅是其中JLists的数量?列表是唯一的名称(或者至少我可以确保)。JPanel本身不是动态的,但其中的列表是动态的。我基本上是说JPanel是“月”,JLists是“类”,在“月”中有“费用”。JLists是从您的代码动态添加到JPanel的?问题是,我只能遍历一个面板的列表,而不能遍历JFrame中的所有列表。@Algram为此创建一个小类,如
ListGroup
,这样您就可以将其传递到您的面板。让我们假设我可以遍历所有列表,然后我仍然有p问题是,我无法确定需要清除哪一个列表,因为我只能询问面板中的某个列表是否有选择。@Algram如果可以从框架中获取面板,则可以从面板中获取列表,因此仍然可以间接迭代JLists。至于确定要清除的列表,策略是清除除了刚才发生选择事件的那一个。我添加了一些代码来帮助说明基本策略。@KevinK因此,由于我的代码的性质,如果其中一个列表发生变化,就不容易在我的JPanel上检测到。目前,它的工作范围是每个JPanel只能有一个选择,但是因为我有多个JPanel,所以我可以有和JPanel一样多的选择。