为什么这里没有调用我的重绘方法?

ha5z0ras  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(342)

这个问题在这里已经有答案了

无法在jpanel上绘制椭圆(2个答案)
19天前关门了。
为什么这里没有调用我的重绘方法?

package UI;

import Observer.Obs;

import javax.swing.*;
import java.awt.*;

public class InfoPanel extends JPanel implements Obs
{
    String bTime = "1:00";
    String wTime = "1:00";
    String chessMessage = "黑方先行";
    int i = 1;

    JLabel blackTime = new JLabel("黑方用时:" + bTime, JLabel.LEFT);
    JLabel chessInfo = new JLabel("游戏信息:" + chessMessage, JLabel.CENTER);
    JLabel whiteChess = new JLabel("白方用时:" + wTime, JLabel.RIGHT);

    public InfoPanel() throws InterruptedException
    {
//        this.setSize(1000,30);
//        this.add(blackTime);
//        this.add(chessInfo);
//        this.add(whiteChess);
//        this.paint();
    }

    public void paint(Graphics g)
    {
        System.out.println("1、paint");
        g.drawString("黑方用时:"+bTime,250,10);
        g.drawString(chessMessage,500,10);
        g.drawString("白方用时:"+wTime,750,10);
        System.out.println(chessMessage);
        System.out.println("2、paint");
    }

    public void updateChessMessage() throws InterruptedException
    {
        if (i % 2 == 0)
        {
            chessMessage = "轮到黑方";
        } else
        {
            chessMessage = "轮到白方";
        }
        i++;
//        chessInfo.setText(chessMessage);
//        chessInfo.updateUI();
//        Thread.sleep(1000);
//        System.out.println(chessInfo.getText());
//        System.out.println("开始重绘");
        this.repaint();
//        System.out.println("重绘结束");
    }

    @Override
    public void response() throws InterruptedException
    {
        updateChessMessage();
        System.out.println("开始重绘");
        this.repaint();
        System.out.println("重绘结束");
//        new Thread(() ->
//        {
//            try
//            {
//                updateChessMessage();
//                System.out.println("开始重绘");
//                InfoPanel.this.repaint();
//                System.out.println("重绘结束");
//            }
//            catch (InterruptedException e)
//            {
//                e.printStackTrace();
//            }
//        }).start();
    }

}

我的输出是保存成功 1、 油漆黑方先行 2、 油漆保存成功 开始重绘 重绘结束 保存成功 开始重绘 重绘结束 保存成功 开始重绘 重绘结束
显然,在这里,他没有调用repaint方法,但是他以前的输出语句调用了repaint方法。我不知道为什么,但由于某种原因,我的重绘方法不起作用;报表帮我查一下。

hgc7kmma

hgc7kmma1#

首先,应该重写方法 paintComponent 而不是方法 paint .
第二,你的第一行被重写了 paintComponent 方法应为:

super.paintComponent(g)

第三,你问题中的代码不是一个最小的、可复制的例子
第四,从你问题中的代码,我得到的印象是,你可能正在调用方法 repaint 从一个不是事件调度线程(edt)并且您不应该这样做的线程。
也许这一课对我们的风俗画表演会有所帮助。

相关问题