2012-03-16 60 views
1

我正在构建Java应用程序。 GameView有一个包含多个PawnViews的BoardView(在这个例子中只有一个)。在JPanel上更改位置JLabel重绘

例子:

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

我认为我们需要更多的信息能够更好地帮助你。你能否尽可能简化问题,甚至创建一个我们可以编译和运行的最小代码示例,它演示了你的问题,但是不包含与问题无关的多余代码,[sscce](http:// SSCCE)? – 2012-03-16 22:35:23

回答

3

你的代码是不可运行,

1)不要混合AWT框架与Swing JComponents,不知道(没有测试),但我认为AWTUtilities仅供摇摆的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),根本没有按“T让我的任何SENCE

4)从来不使用public void update(Graphics g),这种方法是在API内部使用,使用paintComponent代替

5)与JComponents使用Swing Timer移动与调用repaint()

6)JLabel是透明的默认情况下删除this.setOpaque(false);

7)JLabel没有得到任何imlemented LayoutManager,删除this.setLayout(null);

+0

我知道我的代码不可运行。这是一个例子,您可以了解我们如何构建它。 1. JFrame框架不会有所作为 2. this._boardview是正确的,因为我有一个全局变量BoardView _boardview。这仅仅是不存在的例子 3.好 4.我试过的paintComponent也但这并没有改变仍然什么也 5.我会检查出 6.还好 7.没事 – ydd1987 2012-03-16 20:38:56

+0

但不是我的问题的答案,这就是为什么显示白色的痕迹。 – ydd1987 2012-03-16 20:44:07

+0

@yohannesdedope有没有任何其他的答案取决于这里的od代码 – mKorbel 2012-03-16 21:35:35