Java 将JButton信息从一个类传递到主类

Java 将JButton信息从一个类传递到主类,java,swing,jbutton,Java,Swing,Jbutton,我之前也问过类似的问题,所以如果我这样做是在滥用网站,我很抱歉问这个问题,但是这个问题有点不同。我有一个主类,在其中我创建了一个JFrame和一个JPanel。为了避免混乱,我创建了另一个名为“Buttons”的类来保存我的所有JButton。我想将我的JButton添加到主面板(我的JPanel),但从按钮的类继承对主面板的访问时遇到问题 这是我的主要课程: package main; import javax.swing.JButton; import javax.swing.JFrame

我之前也问过类似的问题,所以如果我这样做是在滥用网站,我很抱歉问这个问题,但是这个问题有点不同。我有一个主类,在其中我创建了一个JFrame和一个JPanel。为了避免混乱,我创建了另一个名为“Buttons”的类来保存我的所有JButton。我想将我的JButton添加到主面板(我的JPanel),但从按钮的类继承对主面板的访问时遇到问题

这是我的主要课程:

package main;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel {
    public Main() {
        Main m = new Main();
        //The main window
        JFrame Main = new JFrame("Don't Blink");
        Main.setSize(500,500);
        Main.setResizable(false);
        Main.setVisible(true);
        Main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //The main window's panel
        JPanel mainPanel = new JPanel(); //I want to add buttons to this panel from the Buttons class
        mainPanel.setSize(500, 500);
        mainPanel.setVisible(true);
        Main.add(mainPanel);
    }

    public static void main(String[] args) {
         Main m = new Main();
        }
}
按钮类:

package main;

import javax.swing.JButton;

public class Buttons extends Main {
    public Buttons(Main m) {
        //The button to get a job
        JButton workButton = new JButton("Get a job");
        mainPanel.add(workButton);//The mainPanel here gives me
                                      //the error "mainPanel can
                                      //not be resolved". It 
                                      //doesn't seem to recoginze
                                      //mainPanel
    }
}

从面向对象的角度来看,这有点奇怪,而且似乎不正确

在我看来,您不应该为此创建单独的类,而应该在
Main
类中创建一个方法,并将面板的引用传递给它:

public class Main extends JPanel{

    public Main(){

        Main m = new Main();

            //The main window
            JFrame Main = new JFrame("Don't Blink");
            Main.setSize(500,500);
            Main.setResizable(false);
            Main.setVisible(true);
            Main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            //The main window's panel
            JPanel mainPanel = new JPanel(); //I want to add buttons to this panel from the Buttons class
            mainPanel.setSize(500, 500);
            mainPanel.setVisible(true);
            Main.add(mainPanel);

            addTheButtons(mainPanel); //this does the heavy lifting 
    }

    private addTheButtons(JPanel mainPanel){

        //The button to get a job
        JButton workButton = new JButton("Get a job");
        mainPanel.add(workButton); 

    }
}

只要您不想重用在其他类中创建按钮的逻辑,这就行了——但根据我的经验,这种UI代码的粒度并没有得到太多重用…

首先,用大写字母命名变量名是一种不好的做法,如Main。用例

请不要为此使用继承。我建议您定义一种方法,如下所示:

private Container getButtonContainer() {
    final JPanel buttonPanel = new JPanel(...);

    ...

    buttonPanel.add(button1);
    buttonPanel.add(button2);

    return buttonPanel;
}

然后将此面板添加到主面板。

这里有几个问题。。。首先,这是一个糟糕的OOP设计,但让我们看看

您应该在主面板中添加类变量

public class Main extends JPanel {
  JPanel mainPanel;
现在开始,您不需要声明类型,因为您希望将其放在类作用域中:

this.mainPanel = new JPanel(); // I want to add buttons to this panel from the Buttons class
您试图在按钮中调用它,但只在主构造函数中本地声明了它

您正在新Main中调用新Main,我相信这将以无限递归结束

移除
Main m=newmain()来自主构造函数

我不认为在按钮上继承Main是好的,但是如果你真的需要,Main不知道按钮,无论如何你可以在按钮中使用Main方法而不是Main。我将从main类中删除main方法,并将其添加到Buttons类中,因为它仍然在扩展main

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

现在,buttons声称需要一个Main作为参数,这很奇怪,因为您想要调用Main,而不是另一个Main,我将从buttons构造函数中删除参数Main。您可能认为这样您就没有mainPanel了,但Buttons已经是一个主类,所以它也有mainPanel。

也许您没有在Buttons构造函数中调用super()。调用一个新的按钮而不是一个新的主按钮,在继承方面您会有一些困惑。你尝试的方式行不通。到目前为止,你有问题:8,答案:12,接受答案:0。请重新访问&一些答案@user163505好,如果这回答了您的问题,那么请接受它,这样它就可以关闭。