2016-05-04 9 views
0

Ich versuche, eine generische JList mit einem DefaultListModel in einem JScrollPane behandelt. Ich kann jedoch die JList nicht sehen. HierDefaultListModel in JList in JScrollPane, kann die JList nicht sehen

ist die Klasse:

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

Und hier ist die Klasse, es zu benutzen. In diesem Beispiel habe ich eine FieldScrollList, die Listenelemente anzeigen soll: Hallo und Hallo.

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

    } 
} 

Und das Ergebnis ist wie folgt aus:

GUI Created

Das Ziel der Grenzen und setbackgrounds sind die Lage und Fläche der Inhalte anzuzeigen (visuell)

I don‘ t verstehe, warum die Felder nicht angezeigt werden

+1

Müssen Sie 'JScrollPane' wirklich erweitern? – Berger

+0

Ich begann mit einem JPanel, aber ich muss es nur als Komponente verwenden können. Was sollte der Beste sein? –

+0

'revalidate();' 'repaint();' versuchen Sie dies, nachdem Sie die jList –

Antwort

4

Nicht verlängern JScrollPane. Sie fügen dem Scrollpanel keine Funktionalität hinzu. Alle diese Methoden beziehen sich auf die ListModel und haben nichts mit einer JScrollPane zu tun.

add(jList); 

Fügen Sie keine Komponenten zu einer Bildlaufleiste hinzu. Die JScrollPane ist eine Verbindungskomponente, die JScrollBars und eine JViewport enthält. Die JList muss dem Ansichtsfenster hinzugefügt werden.

Fügen Sie die JList nicht zum Panel hinzu. Sie müssen die JScrollPane an der Platte

Typischerweise dies geschieht mit einfachen Code wie hinzuzufügen:

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

Sie erstellt und Manipulation Swing-Objekte nicht auf dem EDT. Ihr Runnable sollte von SwingUtilities.invokeLater innerhalb von static void main aufgerufen werden.

+0

Ich habe die Thread-Sachen geschrieben, nachdem ich so etwas gesehen habe, aber ich verstehe immer noch nicht warum. Haben Sie bitte eine Dokumentation? –

+2

Ihr Thread-Code ist falsch. Der Code wird nicht auf dem Event Dispatch Thread (EDT) ausgeführt. Lesen Sie den Abschnitt aus dem Swing-Lernprogramm zu [Concurrency] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html), um weitere Informationen zu erhalten. Beachten Sie, dass das Lernprogramm auch einen Abschnitt über die Verwendung von Listen enthält, der ein Arbeitsbeispiel enthält, das Sie hätten verwenden können. Halten Sie den Link zum Swing-Tutorial für alle Swing-Grundlagen griffbereit. – camickr

+0

Der Schnitt eine lange Geschichte kurz Swing nutzt alle Grafik-Updates auf einem Thread, um Änderungen in der Grafik-Pipeline zu koaleszieren. Dein Code wird wahrscheinlich damit durchkommen, aber die technische Erstellung von JComponents an einem anderen Ort als dem EDT ist falsch und wird als schlechte Praxis angesehen. – Lee