繁体   English   中英

将面板从另一个 Class 添加到主 Class

[英]Adding Panel from Another Class to Main Class

我正在尝试将单独的 class 中的 JPanel 和 JButton 添加到框架中,该框架位于主 class 中。 程序编译没有错误,但只显示黑色 window。 视觉目标是让按钮在单击时改变颜色。 我在 GUI_1_1 class 中创建按钮,并在主 class 中创建框架。 我究竟做错了什么?

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

    }

}

下面是第二个 class

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

好的,这里有很多东西要解释你做错了什么,所以我无法为你分解它。 不过,我可以从基础开始。

首先

不要太用力。 Swing 是它自己的东西。 Java 以非常抽象而著称,因此您不必知道它是如何工作的 - just call it and let Java figure it out for you 对于 Java,我并不完全同意,但对于 Swing,我绝对不同意。 Swing 正是因为这个原因而声名狼藉,我认为 90% 的时间都是没有根据的。

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

第二

你可能会觉得这很烦人(与你的问题无关),但在你完成学习后它变得很重要 - 处理你的 class 命名。 类应该对它们所做的事情进行自我描述,因此尽管 JavaDocs 很有帮助,但对于阅读您的代码的人来说,它们不应该是 100% 必要的,以了解它在做什么。

第三

最后回答你的问题。

美东时间

切勿在事件调度线程 (EDT) 之外进行 GUI 工作。 在任何具有 GUI 的环境中,您都有一个单独的线程来完成该显示工作。 您的音乐播放器拥有它,您的互联网浏览器可以处理它 - Java 也不例外。 并且要真正把它带回家,这是多么重要 - 如果您能弄清楚如何进行多线程 GUI 工作,那么您就可以赚很多钱,并且再也不会为您一生中的 rest 工作。

您的 main 方法在它自己的线程中运行,并且 EDT 由您的程序隐式启动。 您的 GUI 应该在 EDT 中更新,而我之前提到的 Java(和 Swing)所做的那些抽象的事情,将在 EDT 中自动发生。 但是,您的代码没有。 你想看的是SwingUtilities.html#invokeLater(java.lang.Runnable) (或者invokeAndWait(...) )你把你的代码作为

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

JFrame

然后就是你说的那一行:

frame.add(new GUI_1_1());

所以JFrame与其他容器略有不同。 您不想将东西“添加”到JFrame 相反,您希望将JPanel设置为JFrame的内容窗格。

除此之外,您获取内容窗格之前的行,然后设置它的背景颜色。 其中,现在您将使用GUI_1_1作为内容窗格,您可以想象该行将不再有意义。 顺便说一句,就您声称看到的黑屏而言,您的内容窗格不是您的显示器似乎是问题所在。

布局管理器

您在GUI_1_1的构造函数中所做的一件事是将布局管理器设置为 null。 这是它自己的另一件事,我不会真正详细说明,因为它的类型太多 - 而 Oracle 已经做得很好,我完全建议阅读以了解如何正确使用布局管理器: https ://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

不断地

我可以继续讨论一段时间,但这个答案已经很冗长了。 就像我提到的,Swing 是一个完整的东西,只需要学习它,就像任何 API 一样。

如果您有其他问题或其他细节,我可以继续编辑此答案并提供更多信息或指向更多阅读的链接。 但我将缩短这一点,以保留更多“通用”建议,这些建议来自我上面已经提出的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM