将JButton信息从一个类传递给Main类

时间:2013-10-02 18:43:05

标签: java swing jbutton

我刚才问了一个类似的问题,所以我很抱歉这个问题,如果我这样做是滥用网站,但这个问题有点不同。我有一个Main类,我在其中创建了一个JFrame和一个JPanel。为了避免混乱,我创建了另一个名为“Buttons”的类来保存我的所有JButton。我想将我的JButton添加到mainPanel(我的JPanel),但是我无法从Button的类中继承对mainPanel的访问。

这是我的主要课程:

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

3 个答案:

答案 0 :(得分:1)

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

您应该将mainPanel

添加为类变量
public class Main extends JPanel {
  JPanel mainPanel;

现在开始你不要声明类型,因为你想把它放在类范围中:

this.mainPanel = new JPanel(); // I want to add buttons to this panel from the Buttons class

您正尝试在Buttons中调用它,但您只在Main构造函数中本地声明它。

你在新Main中调用new Main,我相信这将以无限递归结束。

从您的Main构造函数中删除Main m = new Main();

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

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

现在,按钮声称需要一个Main作为参数,这很奇怪,因为你想调用Main,而不是另一个Main,我将从Buttons构造函数中删除参数Main。你可能认为那时你不会有mainPanel,但Buttons已经是一个Main类,所以它也有mainPanel。

答案 1 :(得分:0)

从OOP的角度来看,这有点奇怪,而且似乎不对。

在我看来,你不应该为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代码的粒度不会被重复使用... < / p>

答案 2 :(得分:0)

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

请不要使用继承。我建议您按如下方式定义方法:

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

    ...

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

    return buttonPanel;
}

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