2013-12-16 3 views
0

inputWidget 및 outputWidget에 모두 양식이 저장되어 있습니다. addInput 및 addOutput 버튼은 secondaryInOutPanel에 두 개의 다른 양식을 표시합니다.스윙 UI 지연 요소 추가 및 제거

그러나 단추를 클릭하여 양식 사이를 이동할 때 상당한 지연이 있습니다. 실제로 양식을 클릭하려고하면 변경됩니다. 그리고 여전히 이전 형태의 일부 보이는 그림이 있습니다.

SwingUtilities를 사용해 보았지만 지연이 최악의 원인이되었습니다.

secondaryInOutPanel = new JPanel(new BorderLayout()); 
    secondaryInOutPanel.setMinimumSize(new Dimension(200,400));  

    JPanel btnPanel = new JPanel(); 
    outinPanel.add(btnPanel, BorderLayout.NORTH); 

    JButton addInput = new JButton("Add Input"); 
    btnPanel.add(addInput); 
    addInput.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      secondaryInOutPanel.removeAll();         
      secondaryInOutPanel.add(inputWidget, BorderLayout.NORTH);    
      JButton addBtn = new JButton("Save Input"); 
      secondaryInOutPanel.add(addBtn, BorderLayout.SOUTH); 
      addBtn.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e) { 
        // TODO Auto-generated method stub      
       }     
      }); 
     } 
    }); 

    JButton addOutput = new JButton("Add Output"); 
    btnPanel.add(addOutput); 
    addOutput.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      secondaryInOutPanel.removeAll();        
      secondaryInOutPanel.add(outputWidget, BorderLayout.NORTH);    
      JButton addBtn = new JButton("Save Output"); 
      secondaryInOutPanel.add(addBtn, BorderLayout.SOUTH); 
      addBtn.addActionListener(new ActionListener(){ 
       public void actionPerformed(ActionEvent e) { 
        // TODO Auto-generated method stub      
       }     
      }); 
     } 
    }); 

답변

2

더 나은 디자인은 입력 패널과 출력 패널을 고정하기 위해 Card Layout을 사용하는 것입니다. 그런 다음 필요에 따라 패널을 바꿀 수 있습니다. 그런 다음 CardLayout은 패널의 유효성을 다시 검사하고 다시 칠하는 작업을 관리합니다.

+0

CardLayout을 위에서 설명한 재 페인트 방법과 비교하여 사용하면 어떤 점이 유리합니까? – kyleED

+0

이미 레이아웃은 패널을 교체하는 모든 작업을 수행하며 패널은 모든 패널의 크기에 따라 크기가 정해집니다. – camickr

1

당신은 변경 후 secondaryInOutPanelrevalidate() 및 또는 repaint()에 전화를 걸 필요가있다.

+0

+1, 보이는 GUI에서 구성 요소를 추가/제거 할 때 revalidate() 및 repaint()하는 것이 일반적입니다. 그러나 전체 패널을 교체 할 때 (즉,'removeAll()'메소드의 사용법을 볼 때마다 일반적으로 더 나은 디자인이있다. – camickr