Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的JAVA GUI要打开多个窗口?_Java_Swing_User Interface_Awt_Frame - Fatal编程技术网

为什么我的JAVA GUI要打开多个窗口?

为什么我的JAVA GUI要打开多个窗口?,java,swing,user-interface,awt,frame,Java,Swing,User Interface,Awt,Frame,我是GUI新手,如果错误真的很明显,我很抱歉。 我试图用几个按钮创建一个简单的窗口,但每次运行代码时,它都会打开四个窗口,而不是一个。任何帮助都将不胜感激 public class CISUC extends JFrame implements Serializable { //interface JFrame mainFrame; JPanel mainPanel; JButton createProject, manageProject,listActive

我是GUI新手,如果错误真的很明显,我很抱歉。 我试图用几个按钮创建一个简单的窗口,但每次运行代码时,它都会打开四个窗口,而不是一个。任何帮助都将不胜感激

public class CISUC extends JFrame implements Serializable {

    //interface
    JFrame mainFrame;
    JPanel mainPanel;
    JButton createProject, manageProject,listActive, listUnfinished,listaFinished;



    public CISUC(){
        //interface
        mainFrame = new JFrame();
        mainFrame.setResizable(false);
        mainPanel = new JPanel();
        mainPanel.setLayout(new GridLayout(2,3));

        createProject= new JButton("Create Project");
        mainPanel.add(createProject);



        manageProject = new JButton("Manage Project");
        mainPanel.add(manageProject);  

        listActive = new JButton("List Active Projects");
        mainPanel.add(listActive); 

        listUnfinished = new JButton("List Unfinished Projects");
        mainPanel.add(listUnfinished);

        listFinished = new JButton("Listar Finished");
        mainPanel.add(listFinished);
        mainFrame.setSize(800, 500);
        mainFrame.add(mainPanel);
        mainFrame.setVisible(true);

    }

public static void main(String[] args) {
        CISUC cisuc = new CISUC();


    }
}



正如ohers已经告诉你的,打开的帧数没有问题,我只是尝试了代码,它打开了一个JFrame

在我看来,代码中有一些错误:您不需要为此扩展JFrame并实现serializable。。。这样,由于父类中未使用的继承(未使用)字段和方法,使应用程序变得更重。此外(正如其他人已经告诉您的),没有与JFrame链接的关闭操作,因此当您按下X按钮时,您的应用程序将一直运行,直到您关闭计算机

要避免这种情况,请添加以下语句:

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  • 我建议您将main方法、main对象和JPanel放在单独的 类,使应用程序更易于阅读、调试和维护。如果您计划拥有许多功能,最好有一个扩展JFrame的自定义类,您可以在其中组装不同的自定义GUI对象,每个对象都扩展一个Swing/AWT组件。。最后在主对象中或直接在主类中调用它们!这没有限制,但要明智地使用继承:许多类意味着更多的样板代码。。。总有一个权衡
  • 另一个好主意应该是将图形初始化(大小, 颜色等)在构造器外部使用单独的方法。只是 创建类似“private void initializeGraphics(){…}
  • 除此之外,在将actionListeners映射到 按钮,将它们放在单独的命名类中,或者至少放在 单独的方法,如
    private void addListeners(){…}
    ,然后 在构造函数代码的末尾调用此函数
我告诉你这一点是因为当使用Swing时,如果你开始在同一个地方添加所有东西,那么很容易会有5000行不可读和不可维护的代码

祝你申请顺利:)


PS:请看一看MigLayout。。。我想你会喜欢它的,即使它在一开始看起来有点复杂。

为什么
CISUC
扩展
JFrame
并在其构造函数中创建一个新的
JFrame
?它应该是一个
JFrame
还是一个
JFrame
?当我运行你的代码(修复语法错误后),它只会弹出一个带有5个按钮的框架。你到底是如何运行代码的?@azurefrog我只是在按NetBeans上的Run按钮。我希望它是一个
JFrame
,因此我将把构造函数更改为
super
callI刚才运行了您的代码。它只打开一个窗口。这里的问题是什么?需要注意的一点是,单击窗口上的
X
不会停止应用程序,因为您没有处理它。所以你需要手动杀死它。@sunildaburi“所以你需要手动杀死它。”不,基于(正确的观察)的错误结论“因为你没有处理它”。为了正确地处理它,有时它就像调用一样简单。