【问题标题】:Inner Class Instantiate Clarification内部类实例化说明
【发布时间】:2015-05-03 10:10:41
【问题描述】:

我不了解内部类 CHameleon 的功能。我不明白第 8 行理论上是什么意思。

我认为这意味着生成将在内部类之外访问的 JFrame 的重复版本,以便操作预期的 JFrame 对象。

编辑:代码带来空指针异常错误,因为从未引用过 JFrame 对象。 解决方案:将 JFrame 帧修改为最终的 JFrame 帧。

这就引出了一个问题,如果有多个 JFrame 会怎样?

例如,如果我有一个种植不同蔬菜的班级花园,我创建了一个内部班级颜色板来为这些蔬菜着色。是创建针对特定蔬菜的特定类的唯一解决方案吗?所以回答我自己的问题,在多个 JFrame 的情况下,它们会显示为不同类型的类,我的情况是?

public class LabelsButtonsPanelsandSnakes {

public static void main(String[] args){
    final JFrame frame = new JFrame("Test"); 

    JMenuBar menuBar = new JMenuBar();  //menubar  
    JMenu menu = new JMenu("Menu");

    JMenuItem chameleon = new JMenuItem("Change Color"); 

    class CHameleonaction implements ActionListener{ //inside class opens 
        JFrame frameHolder;                          //line 8
        public void actionPerformed(ActionEvent e)
        {
            frame.getContentPane().setBackground(new Color(112,253,95));
        }
    }                                                //inside class ends 
    chameleon.addActionListener(new CHameleonaction()); 

    menuBar.add(menu);
    frame.setJMenuBar(menuBar);
}

【问题讨论】:

  • 我也不明白frameHolder 变量。那是错误的,看起来会导致 NullPointerException。
  • 没错。看来我的问题是如何将 JFrame 对象从外部类桥接到内部类以进行操作。
  • 这基本上只是糟糕的设计......这里没有嵌套类的理由。只需使用匿名 ActionListener 类实现,并使您需要访问的框架成为最终的(如果您真的需要它)。如果您希望我发布详细信息,请告诉我。
  • 如果您询问的代码产生异常,在您的问题中告诉我们这将是明智和礼貌的。
  • 根据可能的回答,您的上述问题可以通过将frame 设为final 变量:final JFrame frame = new JFrame("Test"); ,然后从 ActionListener 中引用框架并删除 frameHolder 变量来解决。但无论如何,您的代码设计已关闭。

标签: java swing instantiation inner-classes


【解决方案1】:

你在你的 main 方法中做的太多了,而且大部分代码都属于其他地方,因为 main 方法应该主要用于创建你的 main 对象并启动它们,但其他的很少.正如我在评论中指出的那样,您当前的代码看起来会引导您到 NullPointerException,因为您试图在似乎从未初始化过的字段上调用方法。我同意您将内部类用于简单的侦听器接口,并且如前所述,匿名内部类可以正常工作,但您必须谨慎行事。如果您需要引用外部类变量,您有几个选择:

  • 如果外部变量是字段而不是局部变量,内部类可以直接引用它。
  • 如果是局部变量,则必须声明为final
  • 大多数 Swing 侦听器都有一个 XxxEvent 参数,该参数通过 getSource() 返回事件源,这通常会将您引导至非内部类引用

例如

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.*;

public class Foo2 extends JPanel {
   private static final Color NEW_COLOR = new Color(112,253,95);
   private static final int PREF_W = 400;
   private static final int PREF_H = PREF_W;
   private JMenuBar menuBar = new JMenuBar();

   public Foo2() {
      JMenuItem chameleon = new JMenuItem(new ChangeColorAction("Change Color")); 
      JMenu menu = new JMenu("Menu");
      menu.add(chameleon);
      menuBar.add(menu);
   }

   public JMenuBar getMenuBar() {
      return menuBar;
   }

   @Override
   public Dimension getPreferredSize() {
      if (isPreferredSizeSet()) {
         return super.getPreferredSize();
      }
      return new Dimension(PREF_W, PREF_H);
   }

   private class ChangeColorAction extends AbstractAction {
      public ChangeColorAction(String name) {
         super(name);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         setBackground(NEW_COLOR);
      }
   }

   private static void createAndShowGui() {
      Foo2 mainPanel = new Foo2();

      JFrame frame = new JFrame("Foo2");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.setJMenuBar(mainPanel.getMenuBar());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多