Strange Swing compile-time accessibility error
Here is the code -
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);
}
}
}
And here is the error message -
No enclosing instance of type SetLabelForDemo is accessible. Must qualify the allocation with an enclosing instance of type SetLabelForDemo (e.g. x.new A() where x is an instance of SetLabelForDemo).
I don't understand this error at all. To me, everything seems perfectly valid. Am I missing something?
You'll have to declare your class JLabeledButton
static since you instantiate it within a static context:
private static final class JLabeledButton extends JButton {
...
}
Because your method createAndShowGUI
is static the compiler does not know for which instance of SetLabelForDemo
you are creating the enclosed class.
The JLabeledButton class should be static. Else, it can only be instantiated as part of an enclosing SetLabelForDemo instance. A non static inner class must always have an implicit reference to its enclosing instance.
I know you've accepted an answer, but the other way to solve it is to instantiate the inner class on an instance of the outer class. e.g.,
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);
}
This is a funny syntax, but it works. And this has nothing to do with Swing and all to do with use of inner classes inside of a static context.
Mark JLabeledButton
as static
class.
精彩评论