我正在尝试一个简单的图形游戏。我想要的是当球员输球,比赛结束时#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
所以,如果我理解正确 - 问题是按钮被添加,但没有显示,对吧?我想知道为什么会发生这种情况,而不是如何解决这个问题。
再次感谢
答案 0 :(得分:0)