【问题标题】:Java Swing how to clear a JFrame?Java Swing如何清除一个JFrame?
【发布时间】:2022-01-10 05:49:32
【问题描述】:

很遗憾,我无法在任何地方找到问题的答案。

这是我的程序:

import javax.swing.*;
import java.awt.*;

public class TestClass {

    public static void main(String[] args) {

        JFrame window = new JFrame("Window");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1,1));

        JButton button = new JButton("Button");
        button.addActionListener(e -> windowPreparation(window));

        panel.add(button);

        window.add(panel);
        window.setSize(800, 600);
        window.setVisible(true);
    }

    private static void windowPreparation(JFrame window) {
        window.removeAll();
        window.validate();
        window.repaint();
    }
}

我想要实现的目标:按下按钮后,JFrame 应该被重置(我想用那个按钮删除那个 JPanel),以便我可以将它传递给另一个类,然后用这个 JFrame 做其他事情. 为了让这个类可以毫无问题地做到这一点,我想事先清除 JFrame。 我刚刚尝试过,因为它是写在我的代码中的,问题是它不起作用,只要我按下按钮,窗口就会冻结。有谁知道我做错了什么?

【问题讨论】:

  • 使用为此类事情设计CardLayout
  • 你的“基本”问题是,JFrame 是一个复合组件。也就是说,有许多其他组件构成了它的基本结构。所以removeAll 实际上是在删除所有其他你不想做的组件。相反,您应该以getContentPane().removeAll() 开头。话虽如此,我很想简化问题并将框架排除在等式之外,并拥有一个用作基本容器的“主容器”。但如果没有更多细节,我同意 Andrew,请改用 CardLayout
  • 是的,我用 cardLayout 重构了我的项目,现在一切正常,谢谢 :D

标签: java swing jframe jpanel


【解决方案1】:

使用window.remove(panel); 而不是window.removeAll()

即:

import javax.swing.*;
import java.awt.*;

public class TestClass {

    public static void main(String[] args) {

        JFrame window = new JFrame("Window");
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);

        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(1,1));

        JButton button = new JButton("Button");
        button.addActionListener(e -> windowPreparation(window, panel));

        panel.add(button);

        window.add(panel);
        window.setSize(800, 600);
        window.setVisible(true);
    }

    private static void windowPreparation(JFrame window, JPanel panel) {
        window.remove(panel);
        window.validate();
        window.repaint();
    }
}

我会更正为什么您的原始解决方案不起作用,但我认为这是因为JFrame 中有“基础设施”Components 与您添加的组件无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2011-05-25
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多