【问题标题】:add remove panel on jframe runtime在 jframe 运行时添加删除面板
【发布时间】:2012-11-27 18:21:06
【问题描述】:

我正在尝试借助以下代码在摆动窗口 JFrame Container 上添加和删除面板。如果 JPanel 在构造函数中添加但未在运行时添加,则会添加 JPanel。

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

class test extends JFrame implements ActionListener {
    test() {
        Container cp = this.getContentPane();
        JButton b1 = new JButton("add");
        JButton b2 = new JButton("remove");
        cp.add(b1);
        cp.add(b2);
        b1.addActionListener(this);
        b2.addActionListener(this);
    }

    public void actionPerformed(ActionEvent ae) {
        if (ae.getActionCommand().equals("add")) {
            panel1 frm = new panel1();
            cp.add(frm);
        }
        if (ae.getActionCommand().equals("remove")) {
            remove(frm);
        }
    }

    public static void main(String args[]) {
        test t1 = new test();
        t1.show(true);
    }
}

class panel1 extends JPanel {
    panel1() {
        JButton b1 = new JButton("ok");
        add(b1);
    }
}

【问题讨论】:

  • 您需要使用 repaint() 方法重新绘制和/或验证您的整个框架,这应该在添加或删除您的面板后完成
  • “未添加运行时”是什么意思?

标签: java swing jframe jpanel


【解决方案1】:
  1. 对于您的概念(删除或添加JPanelJFrame 之后)必须调用validate()repaint()JFrame

  2. 最好使用CardLayout

【讨论】:

  • 我必须调用 validate() 和 repaint() 方法。
  • 一次,作为最后的代码行,在对 GUI 的所有更改完成后,
  • @mKorbel 打电话给revalidate() 总是比validate()/invalidate() 更好的选择,请参阅here 了解更多信息,但其余部分请+1。
  • @David Kroukamp revalidate(:-) 可用于 JFrame 和 Java7(不知道 OPs 版本),到 Java7 为止,只有 validate(:-),从不使用 invalidate,用于标准 LayoutManagers,这个通知器在 API 中正确实现,没有理由两次调用这个方法
  • 啊是的忘记了revalidate()的Java 7支持
【解决方案2】:

我正在处理类似的问题,我想在运行时更改面板中包含的面板
经过一些测试、重新测试和很多失败后,我的伪算法是这样的:

parentPanel : 包含我们要移除的面板
childPanel : 我们要切换的面板
parentPanelLayout : parentPanel 的布局
editParentLayout() :每次使用不同的 childPanel 和 NEW parentPanelLayout 构建 parentPanel

parentPanel.remove(childPanel); 
editParentLayout();
parentPanel.revalidate();
parentPanel.repaint();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多