JAVA - 绘画问题

时间:2017-02-17 09:10:17

标签: java swing paint

我正在尝试一个简单的图形游戏。我想要的是当球员输球,比赛结束时#34;要显示的消息和要添加到面板的JButton。这是代码:

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    drawBoard(g);
}

private void drawBoard(Graphics g) {

    if(inGame) {
        // painting code goes here
    }

    else {
        gameOver(g);
    }

}

private void gameOver(Graphics g) {

    Font font = new Font("Monospaced", Font.BOLD, 18);
    FontMetrics metrics = g.getFontMetrics(font);

    g.setColor(Color.WHITE);
    g.setFont(font);

    String msg = "Game Over";
    g.drawString(msg, (B_WIDTH - metrics.stringWidth(msg)) / 2, B_HEIGHT / 2);

    JButton btn = new JButton("Again");
    add(btn);
    btn.setLocation(B_WIDTH/2, B_HEIGHT/2); // not working
    revalidate() // drives execution in a recursive loop

}

问题是,如果我添加revalidate()无限按钮。如果我没有,没有添加按钮。有人可以解释一下吗?

谢谢!

编辑:我遵循了MrPk的解决方案,并将gameOver()更改为:

    private void gameOver(Graphics g) {

    Font font = new Font("Monospaced", Font.BOLD, 18);
    FontMetrics metrics = g.getFontMetrics(font);

    g.setColor(Color.WHITE);
    g.setFont(font);

    String msg = "Game Over";
    g.drawString(msg, (B_WIDTH - metrics.stringWidth(msg)) / 2, B_HEIGHT / 2);

   if ( !Arrays.asList(getComponents()).contains(btn) ) {
      add(btn);
      btn.setLocation(100,100);       
   }

   if (Arrays.asList(getComponents()).contains(btn) ) {
       System.out.println("added");
       System.out.println(btn.getX() + "  " + btn.getY());
   }    
}

当游戏结束时,该按钮仍然不可见,但程序会打印出来:

  

加入
  100 100

所以,如果我理解正确 - 问题是按钮被添加,但没有显示,对吧?我想知道为什么会发生这种情况,而不是如何解决这个问题。

再次感谢

1 个答案:

答案 0 :(得分:0)

使用repaint()而不是rev​​alidate()。

以下是repaint()和revalidate()之间的区别:

Java Swing revalidate() vs repaint()