java - 如何在 Swing 中从多个 JList 中仅选择一项

标签 java swing selection jlist

所以我有一个 GUI,它在创建类别时创建 Jlists。我只希望用户能够一次从任何 jlist 中选择一项。我还检索有关所选项目的信息,例如其在链接列表中的位置。然而,到目前为止,我的代码出现了一个错误,但它似乎并不影响功能,想知道是否有人可以帮助我解决这个问题,为什么或如何解决它?

这是我的代码:

public void addListener(final JList jList, final int curListCount) {
        jList.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent evt) {
                jLabel2.setText("");
                if (isSelected == true) {
                    isSelected = false;
                    jList.clearSelection();
                    jLabel2.setText("");
                }
                String selectedString = (jList.getSelectedValue().toString());
                jLabel2.setText(selectedString);
                int selectedIndex = jList.getSelectedIndex();
                isSelected = true;
                System.out.println("Array position is: " + curListCount);
                System.out.println("LinkedList position is: " + selectedIndex);
             }
        });
}

出现的错误是:

'Array position is: 3 LinkedList position is: 0 Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at smartChart.wbt$1.valueChanged(wbt.java:57)
at javax.swing.JList.fireSelectionValueChanged(JList.java:1798)
at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1812)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:164)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:211)
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:405)
at javax.swing.DefaultListSelectionModel.changeSelection(DefaultListSelectionModel.java:415)
at javax.swing.DefaultListSelectionModel.removeSelectionIntervalImpl(DefaultListSelectionModel.java:576)
at javax.swing.DefaultListSelectionModel.clearSelection(DefaultListSelectionModel.java:420)
at javax.swing.JList.clearSelection(JList.java:2045)
at smartChart.wbt$1.valueChanged(wbt.java:54)
at javax.swing.JList.fireSelectionValueChanged(JList.java:1798)
at javax.swing.JList$ListSelectionHandler.valueChanged(JList.java:1812)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:184)
at javax.swing.DefaultListSelectionModel.fireValueChanged(DefaultListSelectionModel.java:154)
at javax.swing.DefaultListSelectionModel.setValueIsAdjusting(DefaultListSelectionModel.java:685)
at javax.swing.JList.setValueIsAdjusting(JList.java:2142)
at javax.swing.plaf.basic.BasicListUI$Handler.mouseReleased(BasicListUI.java:2796)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)'

有什么想法吗?提前致谢。

最佳答案

String selectedString = (jList.getSelectedValue().toString());

看起来这一行抛出了异常。

您在同一个监听器中清除选择,它又会调用选择更改。

尝试将获取的值移到jList.clearSelection()之前。

此外,我还会引入一个标志来显示用户单击或清除选择的代码中的选择更改。将标志 isMyCode 设置为 true(默认为 false),如果为 true,则跳过处理。

关于java - 如何在 Swing 中从多个 JList 中仅选择一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21457423/

相关文章:

Java - 选择排序算法

javascript - 在 HTML 文件输入元素中仅显示 XML 文件

java - 如何在 Spring Data 中漂亮地更新 JPA 实体?

java - 删除 JTable 底部白色边框

java - 对行进行排序后更改 Swing JTable 中的行颜色

java - 在 Java 中实现新按钮

visual-studio-code - VSCode 箭头选择模式怎么出去?

java - intellij idea中隐藏包或文件

java - 如何将序列当前值更改为之前的值?

java - 为什么 gradle 无法使用分类器找到我的本地 Maven 依赖项?