다음은 문제를 설명하는 실행 가능한 코드입니다. -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));
}
}
감사. 그것은 작동합니다! (+1). 조금 더 자세히 설명해 주시겠습니까? 이전의 모든 유효성 검사가 수행하는 동안 마지막 유효성 검사가 레이아웃을 변경하지 않는 이유는 무엇입니까? (분명히 나는 많은 스윙 개발을하지 않는다!) –
마지막 유효성 검사 *는 * 레이아웃을 변경 * 당신은 단지 그것을 볼 수 없습니다. 마지막 구성 요소는 실제로 유효성 검사를 호출 한 후에 제거되었지만이 제거의 시각적 증거를 보려면 구성 요소를 다시 칠해야합니다. –
@HovercraftFullOfEels : 감사합니다. –