2012-02-07 6 views
5

다음은 문제를 설명하는 실행 가능한 코드입니다. -JPanel에서 동적으로 구성 요소를 제거

s3과 s2는 제거 할 수 있지만 제거 할 수는 없습니다.
이것은 MigLayout과 관련이 없습니다 (사용하고있는 것 같습니다). 기본 레이아웃에서도 같은 동작을 보입니다. 먼저


import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class MyFrame2 extends JFrame { 
    private JPanel main; 
    private JPanel s1; 
    private JPanel s2; 
    private JPanel s3; 

    public static void main(String[] args) throws InterruptedException { 
     MyFrame2 f = new MyFrame2(); 
     f.setVisible(true); 
     Thread.sleep(2000); //you can see all three panels for two seconds 

     f.main.remove(f.s1); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s2); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s3); 
     f.main.validate(); 
    } 

    public MyFrame2() { 
     main = new JPanel(); 

     main.setLayout(new MigLayout()); 

     main.add(new JLabel("Why does s3 not disappear?"),"w 200, h 100, wrap"); 

     s1 = new JPanel(); 
     s1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s1")); 
     main.add(s1,"w 90%, h 300, wrap"); 

     s2 = new JPanel(); 
     s2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s2")); 
     main.add(s2,"w 90%, h 300, wrap"); 

     s3 = new JPanel(); 
     s3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s3")); 
     main.add(s3,"w 90%, h 300, wrap"); 

     getContentPane().setLayout(new BorderLayout()); 
     getContentPane().add(main, BorderLayout.CENTER); 

     setSize(new Dimension(800, 600)); 

    } 
} 

답변

11

전화 :하고 설계 변경되지 않습니다 마지막 검증으로

f.repaint(50L); 

.

+0

감사. 그것은 작동합니다! (+1). 조금 더 자세히 설명해 주시겠습니까? 이전의 모든 유효성 검사가 수행하는 동안 마지막 유효성 검사가 레이아웃을 변경하지 않는 이유는 무엇입니까? (분명히 나는 ​​많은 스윙 개발을하지 않는다!) –

+2

마지막 유효성 검사 *는 * 레이아웃을 변경 * 당신은 단지 그것을 볼 수 없습니다. 마지막 구성 요소는 실제로 유효성 검사를 호출 한 후에 제거되었지만이 제거의 시각적 증거를 보려면 구성 요소를 다시 칠해야합니다. –

+0

@HovercraftFullOfEels : 감사합니다. –

5

, 스윙 GUI 개체를 구성하고 event dispatch thread를 조작,하지만 당신은 동부 서머 타임에 잠을 잘해야한다. 대신, here과 같이 javax.swing.Timer을 사용하여 시간을 표시하십시오. 마지막 f.validate() 후 마지막에

+0

감사합니다. 이것은 문제를 데모하기위한 간단한 해킹 일뿐입니다. –

+1

@amol : 형제 구성 요소가 영향을 받고 크기가 변경되었으며 유효성 검사에서 다시 그려야했습니다. 마지막 구성 요소가 그러한 다시 그리기를 트리거하지 않았습니다. (이 댓글의 죄송합니다 잘못된 지점) –

관련 문제