2017-01-06 16 views
1

Jlistのコンポーネントがあります。最初のリストの項目が選択されると、次のリストに新しい選択肢のセットが動的に表示されます。動的JListsを作成するにはどうしたらいいですか?

たとえば、最初のリストには、「A」、「B」、「C」の3つの項目があります。 「A」をクリックすると、次のリストに1,2,3,4,5などが表示されます。「B」をクリックすると、次のリストには7,8,9などが表示されます。これらのリストが必要ですこの論理。

general list scheme

目的は、このようにGUIを実装することです:

アウトラインで

specific GUI

+0

、 'ComboBoxModel'ためこちら(http://stackoverflow.com/a/3191882/230513)に示すように、依存リストの' ListModel'を更新します。 – trashgod

+1

その上のラベルが暗示するリストの選択動作を除いて、 'JTree'がアイテムを表示する方が良いことが分かります。しかし、リストB(Single Interval)の選択候補をオリジナルの説明に合わせようとすると、ユーザーが最初のリストでAを選択し、2番目のリストでA、2、3、4を選択するとどうなりますか?そのイベントの第3のリストには何が表示されますか? BTW - 私は、問題がより「リアル」でなく「抽象度が低い」ときに助言を与える方が簡単だと分かります。それを助けるために、3つのリストの項目は何ですか? –

+0

http://i.hizliresim.com/MoRJ2Q.png私はこのようなものを実装しようとします。それは3番目のリストを持つ必要はありませんそれは情報のためのパネルにすることができます。 –

答えて

3

  • が最初JListListSelectionListenerを追加します。

  • 選択ハンドラでは、setModel()を使用して、2番目のリストのモデルを現在の選択の正しいListModelに設定します。

    list1.addListSelectionListener((ListSelectionEvent e) -> { 
        if (!e.getValueIsAdjusting()) { 
         list2.setModel(models.get(list1.getSelectedIndex())); 
        } 
    }); 
    
  • 同様に、第JListListSelectionListenerを追加し、それに応じて第三のパネルを更新します。

同様のアプローチは

ComboBoxModelため hereが示されています。関連する exampleは、同様の方法を使用して、ファイルシステムツリーを列に表示します。選択に

select Aselect 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); 
    } 
} 
関連する問題