簡體   English   中英

如何創建動態JList?

[英]How can I create dynamic JLists?

我有多個Jlist組件。 當選擇第一個列表中的項目時,下一個列表應動態顯示一組新的可能選擇。

例如,第一個列表可能具有三個項目,分別是“ A”,“ B”,“ C”。 當我單擊“ A”時,下一個列表應顯示1、2、3、4、5等。當我單擊“ B”時,下一個列表應顯示7、8、9等。我需要使用這些列表這種邏輯。

一般清單方案

目的是實現這樣的GUI:

特定的GUI

概括來說,

  • ListSelectionListener添加到第一個JList

  • 在選擇處理程序中,使用setModel()將第二個列表的模型設置為當前選擇的正確ListModel

     list1.addListSelectionListener((ListSelectionEvent e) -> { if (!e.getValueIsAdjusting()) { list2.setModel(models.get(list1.getSelectedIndex())); } }); 
  • 同樣,將ListSelectionListener添加到第二個JList並相應地更新第三個面板。

這里ComboBoxModel顯示類似的方法。 此相關示例使用類似的方法在列中顯示文件系統樹。

選擇一個 選擇B

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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM