JButtons在paintComponent()中表现异常

3
抱歉标题不够描述性,但我不确定如何传达问题。首先,JButtons 时不时会以应该创建它们的相同顺序多次创建自己。另一个问题是,当我使用 setLocation() 方法重新定位它们时,它会在我想要它们的位置创建新的 JButtons,但也会将旧的 JButtons 保留在原地。我不知道是否只需刷新图形或发生了什么。感谢您的帮助。
数组 playerHand() 在 Player 类中定义,长度为 5。
public void paintComponent(java.awt.Graphics g){
    setBackground(Color.GREEN);

    // create a Graphics2D object from the graphics object for drawing shape
    Graphics2D gr=(Graphics2D) g;

    for(int x=0;x<Player.hand.size();x++){
        Card c = Player.hand.get(x);                    //c = current element in array
        c.XCenter = 30 + 140*x;                         
        c.XCord = c.XCenter - 30;
        c.YCord = 0;


        //5 pixel thick pen
        gr.setStroke(new java.awt.BasicStroke(3));            
        gr.setColor(Color.black);                       //sets pen color to black
        gr.drawRect(c.XCord, c.YCord, c.cardWidth-1, c.cardHeight-1);          //draws card outline
        gr.setFont(new Font("Serif", Font.PLAIN, 18));

        gr.drawString(c.name, c.XCord+10, c.YCord+20);

        gr.drawString("Atk: ", c.XCord+10, c.YCord+60);
        gr.drawString(""+c.attack, c.XCord+60, c.YCord+60);

        gr.drawString("Def: ", c.XCord+10, c.YCord+80);
        gr.drawString(""+c.defence, c.XCord+60, c.YCord+80);

        gr.drawString("HP: ", c.XCord+10, c.YCord+100);
        gr.drawString(""+c.health, c.XCord+60, c.YCord+100);

        JButton button = new JButton(c.name);
        button.setSize(c.cardWidth, c.cardHeight);
        //button.setLocation(c.XCord, c.YCord);
        this.add(button);
        repaint();
    }
}   //end of paintComponent

thisJPanel 的扩展吗?我认为是的。 - tbodt
1个回答

5
以下是您的方法中存在的几个问题(由“!!!!”注释标记):
public void paintComponent(java.awt.Graphics g){
    setBackground(Color.GREEN); // !!!!
    Graphics2D gr=(Graphics2D) g;
    for(int x=0;x<Player.hand.size();x++){

        // .... etc ....

        JButton button = new JButton(c.name);  // !!!! yikes !!!!
        button.setSize(c.cardWidth, c.cardHeight);
        //button.setLocation(c.XCord, c.YCord);
        this.add(button);  // !!!! yikes !!!!
        repaint();  // !!!!
    }
}
  • 不要在paintComponent(...)中添加GUI组件。永远不要这样做。
  • 该方法应仅用于绘制,而且绝不能用于程序逻辑或GUI构建。
  • 您无法完全控制何时或是否会调用它。
  • 它需要尽可能快,以使您的程序反应良好。
  • 如果可能,请避免在paintComponent(...)中创建对象。
  • 在此方法中避免文件I/O(虽然您上面的代码没有问题)。
  • 不要在此方法中调用setBackground(...)。在构造函数或其他方法中执行此操作。
  • 永远不要从此方法内部调用repaint()
  • 不要忘记在覆盖中调用super的paintComponent(g)方法。

针对您的问题:

首先,JButtons偶尔会以与循环应创建它们的相同顺序多次创建自己。

这是因为您无法控制paintComponent何时或多久被调用。JVM可能会根据来自操作系统的有关脏区域的信息调用它,或者程序可能会请求重绘,但因此,程序逻辑和GUI构建永远不应在此方法中。

我遇到的另一个问题是,当我使用setLocation()方法重新定位它们时,它会在我想要它们的位置创建新的JButtons,但也将旧的JButtons留在原地。

很可能您正在看到来自未调用超级的paintComponent方法的图像残留。通过不这样做,您没有让JPanel重绘自己并删除需要替换或刷新的旧图像像素。

我不知道是否只需刷新图形或发生了什么。

不,您需要改变几乎所有内容。

看起来您需要重新考虑GUI的程序流和逻辑,并重新编写一些代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接