【问题标题】:How can I create dynamic JLists?如何创建动态 JList?
【发布时间】:2017-05-21 17:41:46
【问题描述】:

我有多个Jlist 组件。当第一个列表中的一个项目被选中时,下一个列表应该动态显示一组新的可能选择。

例如,第一个列表可能包含三个项目,它们是“A”、“B”、“C”。当我单击“A”时,下一个列表应显示 1、2、3、4、5 等。当我单击“B”时,下一个列表应显示 7、8、9 等。我需要这些列表才能工作这个逻辑。

目标是实现这样的 GUI:

【问题讨论】:

  • 在选择时,更新依赖列表的ListModel,如here for ComboBoxModel所示。
  • 除了它们上面的标签所暗示的列表选择行为之外,可以看出JTree 更好地显示项目。但是尝试将列表 B(Single Interval)的选择建议与您的原始描述相匹配,如果用户在第一个列表中选择 A,然后在第二个列表中选择 2、3、4,会发生什么情况?在该事件中,第三个列表中出现了什么?顺便说一句 - 我发现当问题更“真实”而不是“抽象”时,提供建议更容易。为了帮助解决这个问题,这 3 个列表中的项目是什么?
  • i.hizliresim.com/MoRJ2Q.png 我尝试实现这样的事情。它不必有第三个列表,它可以是信息面板。
  • 提示:添加@trashgod(或重要的@)以通知某人有新评论。现在,查看最后一张图片(我现在已添加到问题中),似乎随时都会选择来自一个联赛的一支球队,信息面板显示该球队的详细信息。 (如果我错了,请纠正我。)我仍然建议使用JTree - 联赛将是顶级节点,而球队将是这些节点的叶子。选择任何团队都会导致团队的详细信息显示在“信息”面板中。我觉得这比拥有两个列表更适合用户。
  • @AndrewThompson,这个截图属于我们的低保真 UI。我考虑过使用 jtree,但我更喜欢使用 List。我决定这样做是为了外观和功能。我不想在项目的这个阶段更改我的草稿。

标签: java swing user-interface jlist


【解决方案1】:

概括地说,

  • ListSelectionListener 添加到第一个JList

  • 在选择处理程序中,使用setModel() 将第二个列表的模型设置为当前选择的正确ListModel

    list1.addListSelectionListener((ListSelectionEvent e) -> {
        if (!e.getValueIsAdjusting()) {
            list2.setModel(models.get(list1.getSelectedIndex()));
        }
    });
    
  • 同样,将ListSelectionListener 添加到第二个JList 并相应地更新第三个面板。

hereComboBoxModel 显示了类似的方法。这个相关的example 使用类似的方法在列中显示文件系统树。

import java.awt.EventQueue;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;

/** @see https://stackoverflow.com/a/41519646/230513 */
public class DynamicJList {

    private final JList<String> list1 = new JList<>(new String[]{"A", "B"});
    private final JList<String> list2 = new JList<>();
    private final List<DefaultListModel> models = new ArrayList<>();

    private void display() {
        JFrame f = new JFrame("DynamicJList");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultListModel<String> model1 = new DefaultListModel<>();
        model1.addElement("A1");
        model1.addElement("A2");
        model1.addElement("A3");
        models.add(model1);
        DefaultListModel<String> model2 = new DefaultListModel<>();
        model2.addElement("B1");
        model2.addElement("B2");
        models.add(model2);
        list2.setModel(model1);
        list1.addListSelectionListener((ListSelectionEvent e) -> {
            if (!e.getValueIsAdjusting()) {
                list2.setModel(models.get(list1.getSelectedIndex()));
            }
        });
        JPanel panel = new JPanel(new GridLayout(1, 0));
        panel.add(list1);
        panel.add(list2);
        f.add(panel);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new DynamicJList()::display);
    }
}

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2018-01-25
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多