2016-05-04 8 views
0

JScrollPane内でDefaultListModelで処理されるジェネリックJListを処理しようとしています。しかし、私はJListを見ることができません。ここでJScrollPaneのJListのDefaultListModelがJListを参照できない

クラスです:

FieldScrollList:

public class FieldScrollList<T> extends JScrollPane { 

     private DefaultListModel<T> listModel; 


     public int length() { 
      return listModel.size(); 
     } 

     public FieldScrollList() { 

      setBorder(new TitledBorder(this.getClass().getSimpleName())); 
      setBackground(Color.PINK); 

      listModel = new DefaultListModel<>(); 
      JList<T> jList = new JList<>(listModel); 
      add(jList); 


      jList.setBorder(new TitledBorder(jList.getClass().getSimpleName())); 


     } 

     public void clear() { 
      listModel.clear(); 
     } 

     public void push(T t) { 
      listModel.add(length(),t); 
     } 

     public <C extends Collection<T>> void pushAll(C coll) { 
      coll.forEach(this::push); 
     } 

     public void pushAll(T[] coll) { 
      for (T t : coll) { 
       push(t); 
      } 
     } 
    } 

そして、ここではそれを使用したクラスです。この例では、リスト項目を表示するFieldScrollList:hiとhelloを示します。

public class test { 


    public static void main(String[] args) { 
     new Thread(() -> { 
      //---------------------------------- Content initialization ------------------ 

      JFrame frame = new JFrame("Test"); 
      JPanel panel = new JPanel(); 
      FieldScrollList<String> list = new FieldScrollList<String>(); 

      //---------------------------------- Strings initialization ------------------ 


      ArrayList<String> strings = new ArrayList<>(); 
      strings.add("Hello"); 
      strings.add("Hi"); 
      strings.forEach(list::push); 

      //---------------------------------- JPanel configuration -------------------- 

      panel.setLayout(new GridLayout(1,1)); 
      panel.add(list); 

      //---------------------------------- JFrame configuration -------------------- 

      frame.add(panel); 
      frame.setPreferredSize(new Dimension(550,600)); 
      frame.pack(); 
      frame.setLocationRelativeTo(null); 
      frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
      frame.setVisible(true); 
     }).start(); 

    } 
} 

そして結果はそのようなものです:

GUI Created

国境やsetbackgroundsの目標は(視覚的に)コンテンツの場所と領域を表示するためにある

私は「ドンフィールドが表示されない理由を理解してください

+1

本当に 'JScrollPane'を拡張する必要がありますか? – Berger

+0

私はJPanelを使い始めましたが、コンポーネントとして使うことができればいいだけです。何が最善でしょうか? –

+0

'revalidate();' 'repaint();' jListを追加した後でこれを試してください –

答えて

4

JScrollPaneを拡張しないでください。スクロール区画に機能を追加していません。これらの方法はすべてListModelに関連しており、JScrollPaneとは関係ありません。

add(jList); 

コンポーネントをスクロール区画に追加しないでください。 JScrollPaneは、JScrollBarsおよびJViewportを含有する化合物成分である。 JListをビューポートに追加する必要があります。

JListをパネルに追加しないでください。あなたが作成し、EDT上のSwingオブジェクトを操作していないされて

JScrollPane scrollPane = new JScrollPane(list); 
panel.add(scrollPane); 
0

:あなたは一般的に、これはのような基本的なコードで行われるパネル

JScrollPaneを追加する必要があります。 Runnableは、static void main内のSwingUtilities.invokeLaterによって呼び出されます。

+0

私はそのようなものを見た後でスレッドのものを書いたが、私はまだそれを理解できない。いくつかのドキュメントをお願いしますか? –

+2

スレッドコードが間違っています。イベントディスパッチスレッド(EDT)でコードが実行されていません。詳細は、[Concurrency](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)のSwingチュートリアルのセクションを参照してください。このチュートリアルには、あなたが使っていた実例がある「リストの使い方」のセクションもあります。すべてのSwingの基本については、Swingチュートリアルのリンクを参考にしてください。 – camickr

+0

短いストーリーを短く切るSwingは、グラフィックスパイプラインの変更を統合するために、1つのスレッド上のすべてのグラフィック更新を利用します。あなたのコードはおそらくそれで取り除かれますが、EDT以外のJComponentsを技術的に作成することは間違っており、悪い習慣とみなされます。 – Lee