当我希望 JPanel 为空白时,我在使 JPanel 显示为白色时遇到问题。我正在创建一款扑克游戏,因为它全部在一个屏幕上运行,所以我想在操作之间创建 5 秒的暂停,以便人们不会看到其他玩家的手牌。
我有一个 boolean 值,当轮到新玩家时,该 boolean 值处于 Activity 状态。我希望它将 JPanel 涂成白色,显示一条消息,要求他们等待,5 秒后,它应该重新绘制,向新玩家显示他们的牌。
当我运行它时,它会在 5 秒暂停期间将旧信息保留在屏幕上。
public void paintComponent( Graphics g )
{
Graphics2D g2 = (Graphics2D) g;
super.paintComponent( g2 ); // call superclass's paintComponent
this.setBackground( new Color(0, 153, 51) );
if( this.newTurn ){
g2.drawString("Starting next turn. . .", 400, 90); //1000,300
int[] pointsX = { 0, 1000, 1000, 0 };
int[] pointsY = { 0, 0, 300, 300 };
g2.fillPolygon( pointsX, pointsY, 4 );
c1 = false;
c2 = false;
c3 = false;
c4 = false;
c5 = false;
try {
Thread.sleep(5000); //1000 milliseconds is one second.
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
this.newTurn = false;
repaint();
}
我可以做什么来解决这个问题?谢谢。
最佳答案
不要使用Thread.sleep(),尤其是在paintComponent()方法中。
此代码将导致 GUI hibernate ,这意味着 GUI 无法重新绘制自身。
如果您想要某种动画,那么您应该使用 Swing Timer 。 Swing Timer 代码也不应该位于paintComponent() 方法中。无论何时调用“下一个玩家回合”逻辑,都应该调用计时器。
此外,切勿在绘画方法中调用 repaint()。绘制代码应该只绘制组件的当前状态,而不应该修改组件的属性或状态。
您可以只显示一个“非装饰模态 JDialog”,其中 JLabel 包含您要显示的消息。因此,您将启动计时器,然后显示对话框,当计时器触发时,您将隐藏对话框。
关于java - 临时空白JPanel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27279295/