2016-05-04 5 views
0

Я пытаюсь создать общий JList, обработанный с помощью DefaultListModel внутри JScrollPane. Однако я не вижу JList.DefaultListModel в JList в JScrollPane, не вижу 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, который может отображать элементы списка: привет и привет.

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 должны отображаться местоположение и область содержимого (визуально)

Я не» t понять, почему поля не отображаются

+1

Вам действительно нужно расширить 'JScrollPane'? – Berger

+0

Я начал использовать JPanel, но мне просто нужно использовать его в качестве компонента. Что должно быть лучше? –

+0

'revalidate();' 'repaint();' попробуйте это после добавления jList –

ответ

4

Не распространяйте JScrollPane. Вы не добавляете никаких функций в scrollpane. Все эти методы связаны с ListModel и не имеют ничего общего с JScrollPane.

add(jList); 

Не добавляйте компоненты в прокрутку. JScrollPane является составным компонентом, который содержит JScrollBars и JViewport. В окне просмотра необходимо добавить JList.

Не добавляйте JList к панели. Вам нужно добавить JScrollPane к панели

Обычно это делается с основным кодом, как:

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

Вы создали и манипулируя Качели объекты не на EDT. Ваш Runnable должен быть вызван SwingUtilities.invokeLater внутри static void main.

+0

Я написал материал, увидев что-то подобное, но я все еще не могу понять, почему. У вас есть документация? –

+2

Код вашей темы неправильный. Код не выполняется в Thread Dispatch Thread (EDT). Прочтите раздел из учебника Swing по [Concurrency] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html) для получения дополнительной информации. Обратите внимание, что в учебнике также есть раздел «Как использовать списки», в котором есть рабочий пример, который вы могли бы использовать. Сохраните ссылку на учебник Swing, удобный для всех основ Swing. – camickr

+0

Сокращенный длинный рассказ Swing использует все графические обновления в одном потоке, чтобы объединить изменения в графическом конвейере. Ваш код, вероятно, сойдет с рук, но технически создание JComponents в любом месте, кроме EDT, неверно и считается плохой практикой. – Lee

Смежные вопросы