我有jFrame
班MainForm
,其中包含main()
,placePanel(panel)
和下拉菜单。从下拉菜单中的项目中,我调用placePanel(panel)
方法将特定面板放在jFrame
容器中。这很好。
但是,当我点击jPanel
课程内的按钮时,我不知道如何切换面板。当我尝试从加载到jFrame
容器中的任何MainForm.placePanel(panel)
调用jPanel
的{{1}}时,我收到错误:jFrame
等。还试过cannot reference non-static content
,但它也不起作用。
我无法弄清楚如何从另一个类访问Mainform.getContainer().add(panel)
的容器,或者如何使用另一个面板中的方法切换面板。
由于
答案 0 :(得分:2)
如果要从另一个对象中调用对象上的方法,则需要对第一个对象进行引用,这样就可以在活动对象本身而不是类上调用该方法(就像你一样)目前正在尝试这样做)。解决此问题的一种方法是将包含JPanels的类的引用传递给具有按钮的动作侦听器代码的类,可能在后者的构造函数中。换句话说,您需要将对当前活动且可视化的MainForm对象的引用传递给具有该按钮的ActionListener的类。
顺便问一下,您是否正在使用CardLayout交换JPanel?如果没有,我建议您调查一下,因为这通常是最简单的方法。
编辑:
例如,假设你有一个名为MainForm的类,它有一个名为swapJPanels的公共方法,允许它交换视图,另一个类MyPanel,你的JButton想要从MainForm类调用一个方法,那么你可以给MyPanel是一个构造函数,它接受一个MainForm参数,并允许您将当前MainForm对象(此类内部)的引用传递给MyPanel对象:
的MainForm:
class MainForm extends JFrame {
public MainForm() {
MyPanel myPanel = new MyPanel(this); // pass "this" or the current MainForm reference to MyPanel
}
public void swapJPanels(int panelNumber) {
}
}
MyPanel:
class MyPanel extends JPanel {
private MainForm myMainForm; // holds the reference to the current MainForm object
public MyPanel(MainForm myMainForm) {
this.myMainForm = myMainForm; // set the reference
JButton swapPanelBtn = new JButton("Swap Panel");
swapPanelBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
swapPanelBtnActionPerformed();
}
});
}
private void swapPanelBtnActionPerformed() {
myMainForm.swapJPanels(0); // calling a method on the reference to the current MainForm object
}
}