【问题标题】:Display JPanel on JFrame from another class在另一个类的 JFrame 上显示 JPanel
【发布时间】:2019-06-08 15:43:47
【问题描述】:

使用我不太熟悉的 NetBeans IDE 和 Java。我有一个 JFrame,上面有一个 JPanel,并说 JPanel 上有按钮。这个 JPanel 在 JFrames 类中。单击其中一个按钮时,我想停止显示此 JPanel,并在不同的类中显示另一个 JPanel。我使用的是 GUI 设计器,因此面板属于不同的类。

我拥有的其中一个按钮的 JFrame 类中的 buttonclick 事件:

    private void buttonActionPerformed(ActionEvent e) {                                         
    panel1.setVisible(false);
    Panel2 panel2 = new Panel2();
    this.add(panel2);
    panel2.setVisible(true);

这会产生 panel1 消失的结果,但留下一个空白 Jframe,因为 panel2 不显示。

我查看了 CardLayout,但我需要面板上的按钮来发出命令,而不是另一个面板上的按钮在 CardLayout 的面板周围交换。

编辑:已重写问题以实际提供上下文,而不仅仅是“请帮助”,因为我被告知我所问的内容过于广泛,这是完全正确的。我才刚刚开始学习 Java,所以如果这仍然是一个广泛的问题,请道歉。

【问题讨论】:

  • 请参阅meta.stackoverflow.com/questions/284236/…...您的问题太宽泛了。实际上,您没有具体的问题,而是需要有经验的人与您坐下来讨论您的想法,并概述解决方案,并在需要的 10、20 个步骤中与您跟进。在职的。但这不是这个社区的目的。
  • 你是对的。我只是有点沮丧,因为到目前为止我所做的一切都给我留下了一个无法正常工作的应用程序,所以这是一种最后的努力。我将尝试提供更具体的编辑。
  • 我理解这种挫败感。也许你必须更多地关注“基本”的东西。与其试图将自己的愿景/想法变成 GUI 应用程序……不如找一本好书或教程,然后先完成别人给你的完整示例。当然,这不是你的想法,但尤其是在进行 GUI 编程时:为了让它做你想做的事情,你必须知道无数的事情。一个微妙的错误,整个 UI 就一团糟。通过反复试验获得这种经验非常困难。首先通过完整的教程获得经验......一步一步。
  • 我一直在这就是为什么我在这里。我一直在试错很长时间,对于我哪里出错或我应该做什么,我没有任何具体的断言。我目前正在重写一些上下文的问题,以免看起来像一个迷路的小学生。
  • 已更新问题!

标签: java netbeans jframe jpanel


【解决方案1】:

让我们尝试在这里提供一些帮助......

首先,在动作侦听器代码中“几乎”什么都不做并不是一个好主意。尤其是在该侦听器中实例化一个新面板对象是个坏主意。

更合理的方法:预先创建所有面板对象。比如:当你的应用程序出现时,可能有一个所需面板对象的列表。然后,在您的动作侦听器代码中,只需添加需要显示的代码,并删除不再需要的代码。

另请注意:

  • 您在动作侦听器中“做”的任何事情都发生在事件调度程序线程上(谷歌该术语)。在这里,这可能是你想要的,但很多时候,它不是。
  • 仅调用 setVisible() 是不够的。您可能必须触发布局管理器进行重绘。从而决定一个特定的布局管理器,并研究动态添加/隐藏组件。

【讨论】:

  • 感谢您的反馈,我现在只使用 JFrames 和选项卡式面板,我知道这不是最佳实践,但可以完成工作。关于实例化事物,我确实曾经在 onload 方法中实例化了面板,然后在按钮单击中设置面板的可见性。这隐藏了第一个面板但没有显示第二个面板,我是否需要其他地方的额外代码来提供上下文或大小等?
【解决方案2】:

我建议处理 frame1 并将 frame2 设置为可见,其中 frame1 包含第一个面板,而 frame2 包含第二个面板,我没有制作 JButton 顺便说一句只是给出了一个解决方案,我没有编译它,但我建议做类似的事情到这个。

JFrame frame1;
JFrame frame2;
JPanel panel1;
JPanel panel2;

public ClassName() {
    frame1 = new JFrame("FIRST FRAME NAME");
    frame2 = new JFrame("SECOND FRAME NAME");

    frame1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame1.setSize(WIDTH , HEIGHT);
    frame1.add(panel1);
    frame2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame2.setSize(WIDTH , HEIGHT);
    frame2.add(panel2);
    frame1.setVisible(true);
}

 private void buttonActionPerformed(ActionEvent e) {                                         
    frame1.dispose();
    frame2.setVisible(true);
}

public static void main(String[] args) {
    new ClassName();
}


【讨论】:

  • 嗨@EpicCircles - 欢迎来到 Stack Overflow。这个答案似乎很像接受的答案(从 2 年前开始) - 尽管您已经输入了一个代码 sn-p 并建议使用 JFrames(实际上是 wiindows)而不是仅仅显示/隐藏面板(并且代码 sn-p 看起来像它可能不起作用 - 操作方法是如何连接的)?你会考虑用额外的细节更新接受的答案吗?
  • 我发布了我认为您正在寻找的内容
【解决方案3】:

这是你要找的吗?

package project3;

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

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

public class File2 extends JFrame implements ActionListener{
    
    JPanel panel1;
    JPanel panel2;
    JButton button;
    JLabel label;
    
    public File2() {
        
        panel1 = new JPanel();
        panel2 = new JPanel();
        
        button = new JButton("CLICK ME");
        label = new JLabel("I AM A LABEL");
        
        button.addActionListener(this);
        
        panel1.add(button);
        panel2.add(label);
        
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setSize(400 , 400);
        this.add(panel2);
        this.add(panel1);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new File2();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        
        panel1.setVisible(false);
        this.remove(panel1);
        this.add(panel2);
        
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-29
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多