【问题标题】:change JPanel after clicking on a button单击按钮后更改 JPanel
【发布时间】:2012-06-14 14:16:29
【问题描述】:

我正在为我的应用构建简单的 GUI。我有几个 JPanel。我想根据通过单击 JButton 执行的操作来显示它们。如何禁用一个 JPanel 并启用另一个?

几个细节。我有一个 JFrame 类,我正在构建起始 gui。我有按钮和一些文字的地方。单击其中一个按钮应更改此 JFrame 中的视图

我的按钮定义

    JButton btnStart = new JButton("Start");
    btnStart.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {

        }
    });
    btnStart.setBounds(10, 11, 110, 23);
    contentPane.add(btnStart);

// 编辑

我发现了问题。按钮在静态方法中

【问题讨论】:

    标签: java swing jframe jpanel


    【解决方案1】:

    简单如下:

    jframe.setContentPane(your_new_panel);
    jframe.invalidate();
    jframe.validate();
    

    【讨论】:

    • 我怎样才能得到 jframe ?这是内部类,因此无法访问它
    • 如果您正在扩展 JFrame,您已经可以访问方法 setContentPane。
    • 该单行代码将无法成功更改显示的组件。
    • @Fixus 很高兴它帮助了你。
    【解决方案2】:
    1. 您可能想使用CardLayout
    2. 或者您可以简单地移除旧面板并添加新面板:

    contentPane.remove(oldPanel);
    contentPane.add(newPanel);
    

    【讨论】:

    • 与上述相同的问题。如何从内部类访问 contentPane ?
    • @Fixus:你不需要获取 contentPane。您只需要对处理使用卡片布局的组件的任何类的引用,并调用您为该类提供的任何公共方法,以使您交换卡片。对于 Suraj:您的 CardLayout rec 比交换组件更好,因为 CardLayout 会考虑组件大小。此外,您不必担心打电话给revalidate()repaint()(您的回答中似乎忘记了)。
    • 如果它是 JFrame,您可以使用以下方法获取 contentPane:“frame.getContentPane()”
    • Ive updated my code. I dont 可以访问 setContentPane() :/ 发现问题。我会检查你的例子
    【解决方案3】:

    首先删除 jPanel 并添加新的 jPanel。然后使用 validate 执行重新布局。

        jFrame.remove(jPanelOld);
        jFrame.add(jPanelNew);
        jFrame.validate();
    

    【讨论】:

    • 您好,欢迎来到 StackOverflow。您能否也写一些文字,而不仅仅是代码 sn-p? (请编辑您的帖子)
    • 谢谢。我添加了一个文本。 :)
    猜你喜欢
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多