Java 将面板从另一个类添加到主类
我试图将JPanel和JButtons从一个单独的类添加到主类中的框架中。程序编译时没有错误,但只显示一个黑色窗口。视觉目标是有一个按钮,当点击时可以改变颜色。我在GUI_1_1类中创建按钮,并在主类中创建框架。我做错了什么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
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一样
我可以继续编辑这个答案,提供更多信息,如果你有其他问题或其他细节,也可以提供更多阅读链接。但我将缩短这一步,从我上面已经提出的建议中保留更多的“通用”建议