2011-09-29 40 views
2

这里是代码 -奇怪的摇摆编译时错误无障碍

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public final class SetLabelForDemo { 
    public static void main(String[] args){ 
     SwingUtilities.invokeLater(new Runnable(){ 
      @Override 
      public void run() { 
       createAndShowGUI();    
      } 
     }); 
    } 

    private static void createAndShowGUI(){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(new JLabeledButton("foo:")); // new JLabeledButton("foo:") is the problem 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private final class JLabeledButton extends JButton{ 
     public JLabeledButton(final String s){ 
      super(); 
      JLabel label = new JLabel(s); 
      label.setLabelFor(this); 
     } 
    } 
} 

,这里是错误消息 -

型SetLabelForDemo没有外围实例访问。必须 使用封闭实例类型 SetLabelForDemo(例如x.new A(),其中x是 SetLabelForDemo的实例)来限定分配。

我完全不理解这个错误。对我而言,一切似乎完全有效。我错过了什么吗?

+0

这是一个糟糕的问题。 :/ – mre

+0

有时发生,如果你离开训练大脑在这个论坛上:-)不可置疑的问题+1 – mKorbel

+0

可能重复的[Java - 没有封闭实例类型Foo是可访问的](http://stackoverflow.com/questions/9560600/java-no-enclosing-instance-of-type-foo-is-accessible) – fabian

回答

3

你必须声明你的类JLabeledButton静态因为你一个静态的环境中实例化它:

private static final class JLabeledButton extends JButton { 
    ... 
} 

因为你的方法createAndShowGUI是静态编译器不知道其中SetLabelForDemo比如,你正在创建的封闭类。

+0

@Howard ... OMG ...我是个白痴。我很惭愧! D: – mre

2

马克JLabeledButton作为static类。

3

JLabeledButton类应该是静态的。否则,它只能被实例化为封闭的SetLabelForDemo实例的一部分。非静态内部类必须始终具有对其封闭实例的隐式引用。

3

我知道你已经接受了答案,但解决它的另一种方法是在外部类的实例上实例化内部类。例如,

private static void createAndShowGUI() { 
    final JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.getContentPane().add(
     new SetLabelForDemo().new JLabeledButton("foo:")); 
    frame.pack(); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
} 

这是一个有趣的语法,但它的工作原理。这与Swing无关,并且与静态上下文中内部类的使用有关。

+0

+1,用于演示静态上下文('static void createAndShowGUI()')中的非静态内部类('JLabeledButton')的实例化。 – trashgod