这是代码 -
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 :(得分: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
类。