Java 重新绘制未调用paintComponent
重新绘制未调用PaintComponent。Java 重新绘制未调用paintComponent,java,swing,Java,Swing,重新绘制未调用PaintComponent。 我也试图从Try类的另一个方法调用它,但并没有成功 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; public class Try extends JPanel { int i =0; @Override public void paintComponent(Graphics g){
我也试图从Try类的另一个方法调用它,但并没有成功
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class Try extends JPanel {
int i =0;
@Override
public void paintComponent(Graphics g){
//super.paintComponent(g);
System.out.println("hey");
}
public static void main(String[] args) {
JFrame f=new JFrame();
Try t = new Try();
f.setSize(500,600);//400 width and 500 height
Container contentPane = f.getContentPane();
contentPane.add(new PaintComponent());
f.setVisible(true);//making the frame visible
while(true){
t.repaint();
}
}
}
有多个问题,@trashgood在评论中提到了其中一些问题
new PaintComponent()
)super.paintComponent(g)代码>除非您自己清理该区域(如果不透明,则几乎填充整个组件背景),否则在重新绘制时,这些组件将出现视觉故障
paintComponent
调用public class Try extends JPanel
{
@Override
public void paintComponent ( final Graphics g )
{
super.paintComponent ( g );
final Graphics2D g2d = ( Graphics2D ) g;
g2d.drawString ( Long.toString ( System.currentTimeMillis () ), 25, 35 );
System.out.println ( "repainted" );
}
public static void main ( final String[] args )
{
SwingUtilities.invokeLater ( new Runnable ()
{
@Override
public void run ()
{
final JFrame f = new JFrame ();
final Try t = new Try ();
f.getContentPane ().add ( t );
f.setSize ( 500, 600 );
f.setVisible ( true );
new Thread ( new Runnable ()
{
@Override
public void run ()
{
try
{
while ( true )
{
t.repaint ();
Thread.sleep ( 25 );
}
}
catch ( final InterruptedException e )
{
//
}
}
} ).start ();
}
} );
}
}
希望这能为你澄清一点
还有一个SwingWorker
类可以帮助在Swing中执行长时间运行的任务,但我在这里使用它并不是为了使示例尽可能简单
还有一个附带说明-您不需要在EDT中调用
repaint()
,因为它自己会将重新绘制请求发送给EDT,所以该方法可以安全地在任何线程上使用(就像我在示例中所做的那样)。也许您的意思是contentPane.add(new Try())
。另外,不要阻塞EDT;请务必查看和。并且不要删除super.paintComponent()
行,请按照了解其工作原理感谢@Mikle示例