我目前正在开发自己的扫雷艇。在覆盖方法setTitle时,我遇到以下问题。
//InfoDisplayer is inner class of class MenuActionListener
class InfoDisplayer extends JDialog{
JLabel info;
BorderLayout infoBorderLayout = new BorderLayout();
public InfoDisplayer(JFrame ownerFrame){
super(ownerFrame,true); //Always modal is set to be true....
info = new JLabel();
setFocusable(false);
setSize(300,400);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setLayout(infoBorderLayout);
add(info,BorderLayout.SOUTH);
setVisible(true);
}
void setInfo(JLabel info){
this.info = info;
}
public void setTitle(String title){
setTitle(title);
}
}
if ((event.getActionCommand()).equals("HowToPlay")){
InfoDisplayer instructionsDisplay = new InfoDisplayer(gUIManagerFrame);
//gUIManagerFrame is an object of its outer class,MenuActionListener
instructionsDisplay.setTitle("INSTRUCTIONS");
instructionsDisplay.setInfo(new JLabel("<html><h1><B>INSTRUCTIONS</B></h1></html>"));
}
else{// if about is clicked!!
InfoDisplayer aboutDisplay = new InfoDisplayer(gUIManagerFrame);
aboutDisplay.setTitle("MineSweeper v0.1");
aboutDisplay.setInfo(new JLabel("<html><h1><B>MineSweeperv1.0</B></h1> </html>"));
}
}
setTitle和setInfo方法不起作用。除此之外,setTitle方法也会产生异常。
在 graphicalUserInterface.BoardMenuBar $ MenuItemsActionListener $ 1InfoDisplayer.setTitle(GUIManager.java:338) 在 graphicalUserInterface.BoardMenuBar $ MenuItemsActionListener $ 1InfoDisplayer.setTitle(GUIManager.java:338) 在 graphicalUserInterface.BoardMenuBar $ MenuItemsActionListener $ 1InfoDisplayer.setTitle(GUIManager.java:338) 在 graphicalUserInterface.BoardMenuBar $ MenuItemsActionListener $ 1InfoDisplayer.setTitle(GUIManager.java:338) 在 graphicalUserInterface.BoardMenuBar $ MenuItemsActionListener $ 1InfoDisplayer.setTitle(GUIManager.java:338) 在 graphicalUserInterface.BoardMenuBar $ $ MenuItemsActionListener 1InfoDisplayer.setTitle(GUIManager.java:338)
我也非常想知道继续异常生成的原因。
编辑:抱歉,我没有看过递归电话。这是我的错。现在我纠正了它。
答案 0 :(得分:2)
public void setTitle(String title){
setTitle(title);
}
这是自称 - 递归。你想要
public void setTitle(String title){
super.setTitle(title);
}
答案 1 :(得分:1)
查看您的setTitle
代码:
public void setTitle(String title) {
setTitle(title);
}
这不可能奏效,可以吗?你的方法只是无休止地递归,最终炸毁堆栈。目前还不清楚你想做什么,但如果你只是想使用继承的实现,你可以完全删除你的方法。
现在setInfo
更改字段的值,但不会将标签添加到对话框中。您可能希望删除现有标签,然后添加新标签。
答案 2 :(得分:1)
public void setTitle(String title){
setTitle(title);
}
}
您尝试覆盖该方法的代码一遍又一遍地调用该方法(递归)。最终堆栈内存不足,程序崩溃。
我假设您正在尝试使用默认的setTitle()方法,为此您希望使用超类的方法setTitle()。
public void setTitle(String title){
super.setTitle(title);
}
}
简单修复,但可以创造奇迹!