Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 将面板从另一个类添加到主类_Java_User Interface - Fatal编程技术网

Java 将面板从另一个类添加到主类

Java 将面板从另一个类添加到主类,java,user-interface,Java,User Interface,我试图将JPanel和JButtons从一个单独的类添加到主类中的框架中。程序编译时没有错误,但只显示一个黑色窗口。视觉目标是有一个按钮,当点击时可以改变颜色。我在GUI_1_1类中创建按钮,并在主类中创建框架。我做错了什么 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class main { public static vo

我试图将JPanel和JButtons从一个单独的类添加到主类中的框架中。程序编译时没有错误,但只显示一个黑色窗口。视觉目标是有一个按钮,当点击时可以改变颜色。我在GUI_1_1类中创建按钮,并在主类中创建框架。我做错了什么

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

public class main {
     public static void main(String[] args) {
        JFrame frame = new JFrame ("Cube GUI");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setSize(1370,790);

        frame.getContentPane().setBackground(Color.BLACK);
        frame.add(new GUI_1_1());

        frame.setVisible(true);

    }

}
第二节课在下面

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

public class GUI_1_1 extends JPanel {
    private int count;
    private JButton button0;
    private JPanel mainpanel;
    private JPanel panel1;

    public GUI_1_1() {
        mainpanel = new JPanel();
        mainpanel.setLayout(null);


        count = 0;
        button0 = new JButton("[1][1]");
        button0.addActionListener(new ButtonListener());
        button0.setOpaque(true);
        button0.setBounds(60,310,50,50);

        mainpanel.add(button0);
        add(mainpanel);

    }

private class ButtonListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {
            if(count==0){
                button0.setBackground(Color.RED);
                count = count + 1;
            } else if(count==1) {
                button0.setBackground(Color.GREEN);
                count = count + 1;
            } else if(count==2) {
                button0.setBackground(Color.ORANGE);
                count = count + 1;
            } else if(count==3) {
                button0.setBackground(Color.BLUE);
                count = count + 1;
            } else if(count==4) {
                button0.setBackground(Color.YELLOW);
                count = count + 1;
            } else if(count==5) {
                button0.setBackground(Color.WHITE);
                count = count - 5;
            }
        }
    }
}

好的,关于你做错了什么,这里有很多要解释的地方,所以我不能为你详细解释。不过我可以从基础开始

首先 不要太难接受。秋千是它自己的东西。Java素有非常抽象的名声,所以你不必知道它是如何工作的-
只要调用它,让Java为你弄清楚它就行了
。对于Java,我并不完全同意,但对于Swing,我绝对不同意。Swing之所以名声不好就是因为这个原因,我认为它90%的时候都是毫无根据的

调用抽象API并不意味着您不必知道它是如何工作的。Swing尤其如此。也就是说,我甚至不能在这个答案中对它进行分解,因为有很多细节,其中很多细节甚至不直接应用于代码,但你应该间接知道,所以你只需要花时间学习它,这需要时间和阅读。不过,最重要的是,Swing不仅仅是一个你不必理解的抽象黑匣子——你必须学习它,而不仅仅是调用随机函数,否则你最终会发现你的代码行为不当

其次 你可能会觉得这很恼火(与你的问题无关),但在你完成学习后,这一点就变得很重要了——学习你的类命名。类应该对它们所做的事情进行自我描述,因此虽然Javadoc很有用,但对于阅读您的代码的人来说,它们不应该是100%必要的,以理解它所做的事情

第三 终于开始问你的问题了

乙二胺四乙酸 切勿在事件分派线程(EDT)之外执行GUI工作。在任何有GUI的环境中,您都有一个单独的线程来完成显示工作。你的音乐播放器有它,你的互联网浏览器处理它-Java也不例外。要真正让大家明白这一点有多么重要——如果你能想出如何进行多线程GUI工作,你将赚很多钱,并且在你的余生中再也不用工作了

主方法在它自己的线程中运行,EDT由程序隐式启动。您的GUI应该在EDT中更新,我前面提到的Java(和Swing)所做的那些抽象的事情将在EDT中自动发生。但是,您的代码没有。你想看的是(或者说)你把代码放在哪里

public static void main (String [] args) {
    SwingUtilities.invokeLater(()->{
        //things you want to happen only in the EDT
    });
    //other things to happen in your main thread
窗口 然后你会说:

frame.add(new GUI_1_1());
因此,
JFrame
与其他容器略有不同。您不想将内容“添加”到
JFrame
。相反,您希望将
JPanel
设置为
JFrame
的内容窗格

除此之外,前面的行将显示内容窗格,然后设置其背景色。现在,您将使用您的
GUI\u 1\u 1
作为内容窗格,您可以想象该行将不再有意义。顺便说一句,关于你声称看到的黑屏,你的内容窗格不是你的显示器似乎是个问题

布局管理器 在
GUI\u 1\u 1
的构造函数中要做的一件事是将布局管理器设置为null。这是它自己的另一整件事,我不会详细说明,因为它太难输入-Oracle已经在这方面做了很好的工作,我完全建议阅读以了解如何正确使用布局管理器:

不停地 我可以继续讲一段时间,但这个答案已经相当冗长。正如我提到的,Swing是一个完整的东西,它只需要学习它,就像任何API一样

我可以继续编辑这个答案,提供更多信息,如果你有其他问题或其他细节,也可以提供更多阅读链接。但我将缩短这一步,从我上面已经提出的建议中保留更多的“通用”建议