我刚才问了一个类似的问题,所以我很抱歉这个问题,如果我这样做是滥用网站,但这个问题有点不同。我有一个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
}
}
答案 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;
}
然后将此面板添加到主面板。