2017-10-27 14 views
0

Swing에서 JList 위젯을 업데이트하는 데 문제가 있습니다.Swing에서 모델에 요소를 추가 한 후 JList가 업데이트되지 않습니다.

모델을 만들고 요소를 추가 한 다음 모델을 JList 요소의 모델로 설정합니다. 모든 것이 잘 작동하고 올바르게 표시됩니다.

문제는 모델에 요소를 추가하려는 경우입니다. 아무것도하지 않습니다.

옵저버 패턴이 업데이트 된 후 요소를 추가하고 있습니다.

내가 뭘 잘못하고 있니?

다음은 UI 코드입니다.

// all the imports 

    public class View extends JPanel implements Observer{ 
     private vivo vivox; 
     private Label label = new Label("Hola Mundo"); 
     private DefaultListModel modelo = new DefaultListModel(); 
     private JList nameList = new JList(modelo); 


     public View() { 
      super(); 
      nameList.setFont(new Font("Arial",Font.BOLD,40)); 
      this.setLayout(new GridLayout()); 
      JButton button = new JButton("New Time"); 
      JButton button1 = new JButton("New Time2"); 
      label.setFont(new Font("Serif", Font.PLAIN, 50)); 
      JPanel group = new JPanel(new GridLayout()); 
      group.add(button); 
      group.add(button1); 

      JPanel east = new JPanel(new BorderLayout()); 
      east.add(label, BorderLayout.NORTH); 
      east.add(nameList, BorderLayout.CENTER); 
      east.add(group, BorderLayout.SOUTH); 

      add(east, BorderLayout.EAST); 
      vivox = new vivo(); 
      vivox.addObserver(this); 
      this.setListElements(); 
     } 

     public void setListElements() { 
      this.modelo.addElement("Messi"); 
      this.modelo.addElement("CR7"); 
      this.modelo.addElement("Iniesta"); 
     } 

     @Override 
     public void update(Observable o, Object arg) { 
      this.label.setText("Some changes"); 
      this.modelo.addElement("Maradona"); 
     } 


    } 
+0

은 어디? 레이아웃에 목록을 추가 – Antoniossss

+0

생성자에서 east.add (nameList, BorderLayout.CENTER); –

+0

update() 메서드가 호출되었음을 어떻게 알 수 있습니까? 메서드에 전달 된 arg의 값을 표시하기위한 몇 가지 기본 디버그 코드를 추가합니다. – camickr

답변

0

문제는 레이아웃과 관련이 있거나 (실제로 일어나는 변경 사항은 보이지 않음)이 shoult가 작동하는 다른 곳에서 발생해야합니다. 목록에 새 요소를 추가 할 때 요소 크기 제한이나 실제 크기로 인해 표시되지 않는 경우를 보여줄 수있는 작동 예제가 있습니다.

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setLayout(new FlowLayout()); 
    DefaultListModel<String> model = new DefaultListModel<>(); 
    for (int i = 0; i < 5; i++) { 
     model.addElement(String.valueOf(Math.random())); 
    } 
    JList list = new JList(model); 
    JButton button = new JButton("Click me!"); 
    button.addActionListener(e -> model.addElement(String.valueOf(Math.random()))); 

    frame.add(list); 
    frame.add(button); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(400,200); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

이것은 간단합니다. 몇 요소를 추가 할 때 프레임을 초과하기 때문에 변경 사항을 볼 수 없으므로 크기를 조정해야합니다. 비슷한 문제가 귀하의 경우에있을 수 있다고 생각합니다. 또는 업데이트 코드가 전혀 호출되지 않습니다.

PS :이 자바 8 예입니다 (사용 람다 - 버전 < 8 environements을 익명 ActionListener 확장 클래스를 사용)