我正在使用带有1.6.0_37 Java的2010 Mac,使用DrJava进行编译。 revalidate方法无法编译,我收到以下错误:
2 errors found:
File: /Users/#########/compsci/Final/ConnectFourFrame.java [line: 123]
Error: /Users/#########/compsci/Final/ConnectFourFrame.java:123: cannot find symbol
symbol : method revalidate()
location: class ConnectFourFrame
这是导致错误的方法:
try
{
//display in window
updateTitleBar();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(currentFile));
colorGrid = (Color[][]) ois.readObject();
makeGrid();
for(int k = 0; k < 6; k++)
{
for(int l = 0; l < 7; l++)
{
if (colorGrid[k][l]==null)
{
grid[k][l] = new BlankTile(new Point(k, l));
}
else if (colorGrid[k][l].equals(Color.red))
{
grid[k][l] = new RedTile(new Point(k, l));
}
else if (colorGrid[k][l].equals(Color.black))
{
grid[k][l] = new BlackTile(new Point(k, l));
}
}
}
putNewGrid();
String currentColor = (String) ois.readObject();
ois.close();
ConnectFourFrame.this.repaint();
ConnectFourFrame.this.revalidate(); //This is the offending line
gp.revalidate();
gp.repaint();
}
外部类是ConnectFourFrame(扩展JFrame并实现Runnable)
如何解决此问题?
答案 0 :(得分:4)
Component.revalidate()
是Java 7中的新功能。大概你在Windows上使用7而在Mac上使用6。
如果您需要使用代码来处理Java 6,那么您将不得不采取不同的方式。 JavaDoc for Component.revalidate说
这是一种方便的方法,可以帮助应用程序开发人员避免手动查找验证根。基本上,它等同于首先在此组件上调用
invalidate()
方法,然后在最近的验证根上调用validate()
方法。
由于JFrame
本身就是验证根,因此您应该能够将revalidate
来电替换为invalidate()
,然后再加上validate()
。
答案 1 :(得分:1)
永远不会在try - catch - finally blo
ck中管理GUI状态(对所有程序语言都有效)
以这种形式(您在此处发布的代码)任何异常中断Swing GUI的刷新
ois.close();
应移至finally block
,
您的问题是JFrame
的切换行顺序,并从(re)
移除revalidate
,例如ConnectFourFrame.this.validate(); and then ConnectFourFrame.this.repaint();
没有理由对invalidate
使用Java versions > Java5
,此方法已在所有LayoutManagers API
中正确实施
Java7
中的在API中添加了revalidate() for JFrame
,对于次要Java版本使用validate()