java - 临时空白JPanel

标签 java swing paintcomponent thread-sleep

当我希望 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/

相关文章:

java - 如何做一个定时器监听器?

java - 如何判断 GraphicsEnvironment 是否存在

java - awt `Graphics` 对象的撤消和重做方法

java - paintComponent 不工作(Java)

java - 透明面板,无伪影

Java:询问用户是否想再玩一次?

java - 在 ListView 中单击的项目位置错误

java - 如何在 AssertJ 中检查相等或均为空白?

java - 如何创建一个新的 JFrame,其位置设置为另一个 JFrame 的中间?

java - 无滚动条 - 带 JPanel 的 JScrollPane