所以我得到的错误是无法访问类型为Window的封闭实例。必须使用Window类型的封闭实例限定分配(例如x.new A(),其中x是Window的实例)。 我认为这是因为我试图实例化一个私有类,但如果我尝试使用它,我会发现一个错误,即htis不能在静态上下文中使用。 那么我怎么做才能让windo wlistener工作?
public class Window {
static MathGame mg;
private static void createAndShowGUI() {
JFrame frame = new JFrame("Epsilon");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mg = new MathGame();
frame.getContentPane().add(mg);
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
//error here: No enclosing instance of type Window is accessible.
//Must qualify the allocation with an enclosing instance of type Window
(e.g. x.new A() where x is an instance of Window).
MathWindowStateListener wsListener = new MathWindowStateListener();
frame.addWindowStateListener(new MathWindowStateListener());
}
/**
* @param args
*/
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private class MathWindowStateListener implements WindowStateListener{
@Override
public void windowStateChanged(WindowEvent we) {
if(we.equals(WindowEvent.WINDOW_CLOSED))
{
System.out.println("window closed");
mg.sql.removeUser();
}
else if(we.equals(WindowEvent.WINDOW_CLOSING))
System.out.println("window closing");
}
}
}
答案 0 :(得分:4)
问题是你试图在静态上下文中使用它,并且由于内部类本身不是静态的,它需要一个封闭类的实例才能存在 - 即,它需要在那个封闭的实例上构建。这将导致一些有趣/丑陋的代码,如
MathWindowStateListener wsListener = mg.new MathWindowStateListener();
最好制作私人内部班级static
,这样可以解决您的问题,而无需诉诸上述kludge。