2017-01-06 6 views
1

У меня есть несколько Jlist компонентов. Когда элемент в первом списке выбран, следующий список должен динамически отображать новый набор возможных вариантов.Как создать динамические JList?

Например, в первом списке могут быть три элемента: «A», «B», «C». Когда я нажимаю «А», следующий список должен показывать 1, 2, 3, 4, 5 и т. Д. Когда я нажимаю «В», следующий список должен показывать 7, 8, 9 и т. Д. Мне нужны эти списки для работы эта логика.

general list scheme

Цель состоит в том, чтобы реализовать графический интерфейс, как это:

specific GUI

+0

При выборе, обновите 'ListModel' зависимого списка, как показано [здесь] (http://stackoverflow.com/a/3191882/230513) для' ComboBoxModel' , – trashgod

+1

За исключением поведения выбора списка, указанного в надписях над ними, было видно, что «JTree» лучше отображать элементы. Но, пытаясь подгонять предложение выбора списка B (Single Interval) к вашему первоначальному описанию, что произойдет, если пользователь выберет A в первом списке, затем 2, 3, 4 во втором? Что отображается в третьем списке в этом случае? Кстати, мне легче дать совет, когда проблема более «реальна» и «абстрактна». Чтобы помочь в этом, каковы элементы в 3 списках? –

+0

http://i.hizliresim.com/MoRJ2Q.png Я пытаюсь реализовать что-то вроде этого. Он не должен иметь 3-й список, это может быть панель для информации. –

ответ

3

В общих чертах,

  • Добавить ListSelectionListener к первому JList.

  • В обработчике выбора используйте setModel(), чтобы установить модель второго списка на правильный ListModel для текущего выбора.

    list1.addListSelectionListener((ListSelectionEvent e) -> { 
        if (!e.getValueIsAdjusting()) { 
         list2.setModel(models.get(list1.getSelectedIndex())); 
        } 
    }); 
    
  • Аналогично, добавьте ListSelectionListener ко второму JList и обновить третью панель соответственно.

Аналогичный подход показан here для ComboBoxModel. В этом отношении example использует аналогичный подход для отображения дерева файловой системы в столбцах.

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