如何在打开新的JFrame时关闭它们?

时间:2016-12-05 18:42:45

标签: java swing jframe

我有2 JFramef1f2分别有按钮b1b2

按钮b1b2切换框架,即如果点击b1,则会打开f2,如果点击b2则会打开f1 }。

我希望我的程序在尝试打开新的JFrame时关闭之前的JFrame,即如果点击了b1,它应该关闭/隐藏f1并打开f2,反之亦然。< / p>

我尝试了setVisible(false),但似乎无效。

我很感激任何帮助或建议。

这是我的代码:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class m extends JFrame implements ActionListener
{
    static JFrame f1,f2;
    static JButton b1,b2;

    public m()
    {
        f1();
    }

    public void f1()
    {
        JFrame f1=new JFrame("frame 1");
        JButton b1=new JButton("frame 2");

        JLabel l1=new JLabel("FRAME 1");

        f1.setSize(600,600);
        b1.setBounds(300,300,100,100);
        l1.setBounds(300,150,100,100);
        b1.addActionListener(this);
        f1.add(b1);
        f1.add(l1);
        f1.setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public void f2()
    {
        JFrame f2=new JFrame("frame 2");
        JButton b2=new JButton("frame 1");
        JLabel l2=new JLabel("FRAME 2");
        f2.setSize(600,600);
        b2.setBounds(300,300,100,100);
        l2.setBounds(300,150,100,100);
        b2.addActionListener(this);
        f2.add(b2);
        f2.add(l2);
        f2.setVisible(true);

        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    }

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

    public void actionPerformed(ActionEvent e)
    {
        String bt=String.valueOf(e.getActionCommand());
        if(bt=="frame 2")
        {
            f1.setVisible(false);
            f2();
        }
        else if(bt=="frame 1")
        {
            f2.setVisible(false);
            f1();
        }
    }
}

1 个答案:

答案 0 :(得分:4)

您的代码中存在多个错误:

  1. 缩进,您应该正确缩进,以便于阅读

  2. 您正在设置组件的边界,而是使用正确的Layout manager,请参阅:Null layout is evilWhy is it frowned upon to use null layout in swing?,而使用null布局和设置绑定可能看起来似乎就像创建复杂图形用户界面的最佳和最简单的方法一样,它不是那样的,因此,你会发现自己陷入麻烦,因为Swing必须在不同的屏幕尺寸,分辨率和PLAF中工作。

  3. 您正在扩展JFrame并创建一个JFrame对象,并且您正在混合它们,请保留其中一个。{li>

    我建议使用后者,否则当你进行扩展时,你会说你的课 JFrame,如果你需要扩展某些内容,请从{{1}延伸而不是。

  4. 请勿使用多个JPanel,请参阅:The use of multiple JFrames, good/bad practice?(BAD),您可能想尝试使用JDialogsCard Layout

  5. 您将JFrameString进行比较,而不是==进行比较!请参阅:How do I compare Strings in Java?

  6. 您拥有自己永远不会使用的静态成员,.equals()JFrame实际上不应该是静态的!

  7. 这一行:JButton而这一行setDefaultCloseOperation(DISPOSE_ON_CLOSE);不适用于setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);f2帧,而是适用于您{f1生成的帧{1}}

  8. 您没有将您的计划放在EDT上

  9. 只需一个简单的程序就可以解决所有这些错误!因此,我建议您在使用GUI之前回到Java基础知识,这会使程序更复杂,更难学习基础知识。

    如果您坚持使用2 extends s:

    ,现在已经说过上述错误了
    JFrame

    这是主要想法,供参考,检查this answer以及链接和重复问题