在JPanel重绘上更改位置JLabel

时间:2012-03-16 19:42:04

标签: java swing jpanel jlabel repaint

我正在构建一个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中重新绘制时遇到了一些问题。

有人可以帮忙吗?

1 个答案:

答案 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);