gpt4 book ai didi

java - 如何使 JTextPane 中的重绘(刷新)文本不闪烁

转载 作者:行者123 更新时间:2023-12-02 06:36:28 25 4
gpt4 key购买 nike

在下面的代码中,我尝试显示一个以 25/秒的频率变化的计数器。但是它会闪烁,并且刷新不流畅,即使将延迟40ms更改为80ms,它仍然会闪烁。如何使刷新更顺畅?- 我使用 JTextPane 的原因是因为我想以 HTML 格式显示(和刷新)文本

import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.UIManager;
import javax.swing.text.html.HTMLDocument;
public class ColumnsInJTextPane
{
public ColumnsInJTextPane(JTextPane textPane, String sLeft, String sRight)
{
StringBuilder text = new StringBuilder( 150 );
text.append( "<html><body>" );
text.append( "<table border='0' style='margin:4px 2px 12px 6px' width='400'>" );
text.append( "<tr>" + "<td width='200' align='left' valign='top' style='margin-right:8px'>" );
text.append( sLeft );
text.append( "</td>" );
text.append( "<td align='left' valign='top' style='margin-right:8px'>" );
text.append( sRight );
text.append( "</td>" + "</tr>" );
text.append( "</table>" );
text.append( "</body></html>" );
textPane.setText( text.toString() );
}

public static void main( String[] args )
{
JTextPane textPane = new JTextPane();
textPane.setContentType( "text/html" );
textPane.setEditable(false);
//to get a consistent (body) appearance use the font from the Label using a CSS rule (instead of the value in javax.swing.text.html.default.css)
Font font = UIManager.getFont( "Label.font" );
String bodyRule =
"body { font-family: " + font.getFamily() + "; " + "font-size: " + font.getSize()*2 + "pt; }";
((HTMLDocument) textPane.getDocument()).getStyleSheet().addRule( bodyRule );
JFrame frame = new JFrame();
frame.setSize(new Dimension (350,200));
frame.add( textPane );
frame.setVisible( true );
for (int i = 0; i < 100000; i++) {
try {
Thread.sleep(40); // even changing it to 80 would not help, it still flickers upon repaint
} catch (InterruptedException e) {
e.printStackTrace();
}

new ColumnsInJTextPane(textPane, Integer.toString(i*10000), Integer.toString(i*2000));
}
}
}

最佳答案

您正在主线程中执行所有操作!!!:

  1. Swing 使用 EDT(事件调度线程)来执行 GUI 相关任务并处理操作事件。将 GUI 创建对象和代码放入 SwingUtilities.invokeLater(new Runnable(){})

  2. 中以将其显示在屏幕上
  3. 对于重复的 GUI 更新任务,请在 Swing 中使用 javax.swing.Timer

教程资源:How to use Swing Timer

关于java - 如何使 JTextPane 中的重绘(刷新)文本不闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19600139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com