java - 从 JPanel 中动态删除组件

标签 java swing miglayout concurrency event-dispatch-thread

这是解释问题的可运行代码 -

我可以删除 s1 和 s2 但不能删除 s3。
这似乎与 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));

    }
}

最佳答案

在最后一个 f.validate() 之后调用:

f.repaint(50L);

因为最后的验证不会改变布局。

关于java - 从 JPanel 中动态删除组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9169350/

相关文章:

java - JFileChooser 的 FileFilter 不起作用

java - miglayout关于列的问题

java - 数组是Java中的对象吗?

java - 使用 Auth Token 的 HTTPGet 抛出错误代码 403

java - Java 8 Swing 中有列表 GUI 组件吗?

Java JLayeredPane 覆盖光标

java - MigLayout:推送不符合我的预期

java - TextField 大小和垂直对齐

java - Java 应用程序能否像 native 替代方案一样响应迅速

java - 计算十六进制圆周率,BBP公式的实现