访问容器字段

时间:2011-02-23 03:05:49

标签: java components containers parent anonymous-class

我有一个非常愚蠢的问题要问。

我正在使用NetBeans构建一个小应用程序,我遇到了以下问题; 我的主要课程名为mainApp,并且正在扩展JFrame,而JPanel又包含一个名为drawingBoard的{​​{1}}我也会因各种(和偏离主题)原因而延伸。

核心问题是,在某些时候我需要访问mainApp的一个字段,但是由于NetBeans实例化我的主类的方式..(作为匿名类)我无法获得引用容器(即我的mainApp)。

如何获取mainApp的引用并在drawingBoard内设置其字段的值?

3 个答案:

答案 0 :(得分:3)

如果您正在扩展,则可以控制构造函数。通过将它们添加到构造函数中来传递您需要的任何引用(当然,将它们分配给成员变量。)

Yay依赖注射!

答案 1 :(得分:1)

Glowcoder的答案很好。另一个选择是使mainApp成为Singleton(如果是逻辑上的话,是Singleton)

答案 2 :(得分:1)

您可以使用Window win = SwingUtilities.getWindowAncestor(myComponent)获取对顶级窗口的引用;并且传入方法调用对顶级窗口最终持有的任何组件的引用。如果您的主类也是您的顶级JFrame(您没有初始化任何其他JFrame),那么您可以将返回的Window转换为顶级类类型并调用其公共方法。

例如:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Foo1 {
   public static void main(String[] args) {
      MainApp mainApp = new MainApp();
      mainApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainApp.pack();
      mainApp.setLocationRelativeTo(null);
      mainApp.setVisible(true);
   }
}

class MainApp extends JFrame {
   public MainApp() {
      getContentPane().add(new DrawingBoard());
   }

   public void mainAppMethod() {
      System.out.println("This is being called from the Main App");
   }
}

class DrawingBoard extends JPanel {
   public DrawingBoard() {
      JButton button = new JButton("Button");
      button.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            MainApp mainApp = (MainApp) SwingUtilities.getWindowAncestor(DrawingBoard.this);
            mainApp.mainAppMethod();
         }
      });
      add(button);
   }
}

通过glowcoder的建议改变:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Foo2 {
   public static void main(String[] args) {
      MainApp2 mainApp = new MainApp2();
      mainApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      mainApp.pack();
      mainApp.setLocationRelativeTo(null);
      mainApp.setVisible(true);
   }
}

class MainApp2 extends JFrame {
   public MainApp2() {
      getContentPane().add(new DrawingBoard2(this));
   }

   public void mainAppMethod() {
      System.out.println("This is being called from the Main App");
   }
}

class DrawingBoard2 extends JPanel {
   private MainApp2 mainApp;

   public DrawingBoard2(final MainApp2 mainApp) {
      this.mainApp = mainApp;
      JButton button = new JButton("Button");
      button.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            buttonActonPerformed();
         }
      });
      add(button);
   }

   private void buttonActonPerformed() {
      mainApp.mainAppMethod();

   }
}

另一个建议:既然您正在学习Swing,那么最好不要使用NetBeans为您生成Swing代码,而是手动编写Swing应用程序代码。通过这样做并研究教程,您将获得更深入和更好地理解Swing如何工作的知识,并且如果您需要使用NetBeans代码生成器来创建除最简单的应用程序之外的任何内容,它将帮助您。 / p>

相关问题