我正在构建一个Java应用程序。 GameView有一个BoardView,它包含多个PawnViews(在这个例子中只有一个)。
示例:
public class GameView extends Frame
{
public GameView()
{
AWTUtilities.setWindowOpaque(this, false);
this.setUndecorated(true);
this.setLayout(null);
this.setResizable(false);
this._boardview = new BoardView();
int x = 0;
int y = 0;
PawnView pv = new PawnView();
this._boardview.AddPawn(pv, 10, 10);
this._boardview.MovePawn(pv, 20, 10);
}
}
public class BoardView extends JPanel
{
public BoardView()
{
this.setOpaque(false);
RepaintManager.currentManager(null).setDoubleBufferingEnabled(true);
this.setLayout(null);
}
@Override
public void update(Graphics g)
{
paint(g);
}
public void AddPawn(PawnView pawnview, int x, int y)
{
this.add(pawnview);
pawnview.setLocation(x, y);
}
public void MovePawn(PawnView pawnview, int x, int y)
{
pawnview.setLocation(x, y);
//this.repaint();
}
}
public class PawnView extends JLabel
{
public PawnView()
{
this.setOpaque(false);
RepaintManager.currentManager(null).setDoubleBufferingEnabled(true);
this.setLayout(null);
}
}
最初一切看起来都很棒(没有MovePawn):
http://dl.dropbox.com/u/7438271/1.png
当我调用MovePawn时,它看起来像:
http://dl.dropbox.com/u/7438271/2.png
我尝试以各种形式致电this.revalidate()
,this.updateUI()
,this.repaint()
,this.paintImmediately()
,但这些都让情况变得更糟:整个JPanel获得了白色背景。
我也尝试覆盖JPanel的paintComponent函数也没有效果。
这只发生在Mac OS X上(完全更新),但我在Windows中重新绘制时遇到了一些问题。
有人可以帮忙吗?
答案 0 :(得分:3)
您的代码无法运行,
1)不要将AWT Frame与Swing JComponents混合,不确定(从未测试过)但我认为AWTUtilities仅适用于Swing JComponent,那么
public class GameView extends Frame
可能是
public class GameView extends JFrame
2)
this._boardview = new BoardView();
必须是
BoardView _boardview = new BoardView();
3)为什么有代码行,
RepaintManager.currentManager(null).setDoubleBufferingEnabled(true);
我看到了用于打印的代码,用于更快的打印,关闭双缓冲,但值currentManager(null)
,根本不会让我任何意外
4)从不使用public void update(Graphics g)
,此方法在API内部使用,使用paintComponent
代替
5)通过调用JComponents
repaint()
使用Swing Timer进行移动
6)JLabel默认为透明删除this.setOpaque(false);
7)JLabel尚未发现任何LayoutManager,删除this.setLayout(null);