这个问题在这里已经有答案了:
无法在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方法。我不知道为什么,但由于某种原因,我的重绘方法不起作用;报表帮我查一下。
1条答案
按热度按时间hgc7kmma1#
首先,应该重写方法
paintComponent
而不是方法paint
.第二,你的第一行被重写了
paintComponent
方法应为:第三,你问题中的代码不是一个最小的、可复制的例子
第四,从你问题中的代码,我得到的印象是,你可能正在调用方法
repaint
从一个不是事件调度线程(edt)并且您不应该这样做的线程。也许这一课对我们的风俗画表演会有所帮助。