this.setVisible(false)无法生效,ActionListener中出现找不到符号编译错误
首先来看你遇到的编译错误:
DrawMap.java:71: 错误: 找不到符号
this.setVisible(false);
^
符号: 方法 setVisible(boolean)
DrawMap.java:82: 错误: 找不到符号
this.setVisible(false);
^
符号: 方法 setVisible(boolean)
注意: 某些输入文件使用或覆盖了已过时的API。
注意: 请使用 -Xlint:deprecation 重新编译以获取详细信息。
2 个错误
结合你的DrawMap extends JComponent的类定义,这个错误最可能的原因是你在匿名内部类形式的ActionListener中,this的指向不对——此时this指代的是ActionListener实例,而不是你的DrawMap组件,ActionListener接口本身并没有setVisible()方法,所以编译器报错。
另外还有一种可能:你误解了setVisible()的作用——即使你正确调用了DrawMap组件的setVisible(false),它也只是隐藏这个组件本身,而不是整个应用窗口。如果你的目标是关闭/隐藏整个窗口,需要获取顶层容器来操作。
解决方案分两种情况:
情况1:你想隐藏DrawMap这个组件本身
在ActionListener的匿名内部类中,需要明确引用外部类的实例,用DrawMap.this代替this:
// 假设你的ActionListener是匿名内部类,修改成这样 yourButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 明确指向外部类DrawMap的实例 DrawMap.this.setVisible(false); } });
情况2:你想隐藏整个应用窗口(比如JFrame)
如果你的DrawMap是某个顶层窗口(比如JFrame)的子组件,需要先获取这个顶层窗口,再调用它的setVisible():
yourButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 获取当前组件所在的顶层窗口 Window topWindow = SwingUtilities.getWindowAncestor(DrawMap.this); if (topWindow != null) { topWindow.setVisible(false); // 如果需要直接关闭窗口,可以调用 dispose() // topWindow.dispose(); } } });
补充说明
JComponent本身是继承自java.awt.Component的,而Component类确实有setVisible(boolean)方法,所以只要你正确引用到DrawMap的实例,调用这个方法是合法的——错误的核心就是匿名内部类中this的指向问题,别搞混了内部类和外部类的实例哦!
内容的提问来源于stack exchange,提问作者user9579621

