Strange Swing编译时可访问性错误

时间:2011-09-29 16:31:27

标签: java eclipse swing

这是代码 -

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)。

我根本不明白这个错误。对我来说,一切似乎都完全有效。我错过了什么吗?

4 个答案:

答案 0 :(得分:3)

您必须在静态上下文中实例化静态类JLabeledButton

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

因为您的方法createAndShowGUI是静态的,所以编译器不知道您创建封闭类的SetLabelForDemo实例。

答案 1 :(得分:3)

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

答案 2 :(得分: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无关,而与在静态上下文中使用内部类有关。

答案 3 :(得分:2)

JLabeledButton标记为static类。