【问题标题】:Switching jPanels in Java from external class从外部类切换 Java 中的 jPanel
【发布时间】:2011-04-17 13:49:22
【问题描述】:

我有jFrameMainForm,其中包含main()placePanel(panel) 和下拉菜单。从下拉菜单中的项目中,我调用placePanel(panel) 方法将特定面板放置在jFrame 容器中。这很好用。

但是,当我单击 jPanel 类中的按钮时,我不知道如何切换面板。当我尝试从加载到jFrame 的容器中的任何jPanel 调用jFrameMainForm.placePanel(panel) 时,我收到错误:cannot reference non-static content 等。我也尝试过Mainform.getContainer().add(panel),但它没有也不行。

我不知道如何从另一个类访问MainForm 的容器,或者如何使用另一个面板中的方法切换面板。

谢谢

【问题讨论】:

    标签: java containers jframe jpanel switch-statement


    【解决方案1】:

    如果你想从另一个对象中调用一个对象的方法,你需要一个对第一个对象的引用,这样你就可以在活动对象本身而不是类上调用该方法(因为你'目前正在尝试做)。解决此问题的一种方法是将包含 JPanel 的类的引用传递给具有按钮的动作侦听器代码的类,可能在后者的构造函数中。换句话说,您需要将对当前活动且可视化的 MainForm 对象的引用传递到具有按钮的 ActionListener 的类中。

    顺便问一下,您是在用 CardLayout 交换 JPanel 吗?如果没有,我建议您研究一下,因为这通常是最简单的方法。

    编辑:

    例如,假设你有一个名为 MainForm 的类,它有一个名为 swapJPanels 的公共方法,允许它交换视图,另一个类 MyPanel 有你的 JButton,想要从 MainForm 类调用一个方法,那么你可以给MyPanel 一个构造函数,它接受 MainForm 参数并允许您将来自当前 MainForm 对象(类内部的 this)的引用传递给 MyPanel 对象:

    主窗体:

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

    我的面板:

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

    【讨论】:

    • 我没有使用cardLayout,我对此一无所知,这是我第一次听说。我要查一下,看看它有什么作用。另外,“通过参考”是什么意思?我已经尝试使用以下方法从 jPanel 引用 jFrame' MainForm: MainForm.getContainer().add(panel)?我知道这是错误的,但我该如何正确“传递参考”?
    • @Luka:你可以在这里找到一个关于如何使用它的教程:How to use CardLayout,但要明白它不会解决你最初的问题——在对一个对象的引用上拥有和调用方法在另一个对象内部。
    • 好的,卡片布局很有趣,但它是一种解决方法。但是我对 MainForm.getContainer().add(panel) 或 MainForm.placePanel(panel) 做错了什么?每当我尝试从 jPanel 使用此代码(在 Jframe 中工作)时,它都会出错。我已经有了 placePanel 方法,如何从另一个类调用它?
    • @Luka:再次您尝试调用 MainForm 类的方法,但这根本行不通。您需要调用 MainForm object 上的方法。如果您不了解其中的区别,您可能应该退出 gui 编码,直到您牢牢掌握基础知识。这些教程可以帮助你:Java Tutorials
    • 你的后一篇文章现在对我来说更清楚了,谢谢:) 据我所知,对象是类的实例。如果我想调用 MainForm 对象,我需要做什么:new MainForm?我想我做到了,但它弹出了一个新的 MainForm,所以我有 2 个......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多