在另一个类的JFrame上显示JPanel

时间:2019-01-14 16:11:29

标签: java netbeans jframe jpanel

使用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消失的结果,但是由于panel2不显示而留下空白的Jframe。

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

编辑:已经重写了问题,以实际提供上下文,而不仅仅是“帮助请”,因为有人告诉我我所问的内容太广泛了,这是完全正确的。我才刚刚开始学习Java,因此,如果仍然要对此道歉,很抱歉。

3 个答案:

答案 0 :(得分:0)

让我们在这里有所帮助...

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

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

还请注意:

  • 您在动作侦听器中执行的所有操作都会在事件分配器线程上发生(请谷歌搜索该术语)。在这里,这可能是您想要的,但通常不是。
  • 仅调用setVisible()是不够的。您可能必须触发布局管理器进行重新绘制。因此,决定选择一个特定的布局管理器,并研究动态添加/隐藏组件的方法。

答案 1 :(得分:0)

我建议处理 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();
}


答案 2 :(得分:0)

这是您要找的吗?

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);
        
    }

}