我在某处有几千行代码,我注意到当我更新太多 JTextPane 时它会闪烁。我在这里写了一个简化版本:
import java.awt.*;
import javax.swing.*;
public class Test
{
static JFrame f;
static JTextPane a;
static final String NL = "\n";
public static void main(String... args)
{
EventQueue.invokeLater(new Runnable(){
public void run()
{
f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.setSize(400, 300);
f.setLocationRelativeTo(null);
a = new JTextPane();
f.add(new JScrollPane(a));
new Thread(new Runnable(){
public void run()
{
int i = 0;
StringBuffer b = new StringBuffer();
while(true)
{
b.append(++i+NL);
a.setText(b.toString());
a.setCaretPosition(b.length());
try{Thread.sleep(10);}catch(Exception e){}
}
}
}).start();
}
});
}
}
这是一个终端 (cmd) 样式的 GUI 组件——
我想我已经在这里做了所有我可以做的优化,包括\n
作为一个最终变量,所以它不会被构造数百次。尽管如此,闪烁是明显且不可接受的。几分钟后,组件完全冻结。我必须非常快速地更新组件,并且更新时窗格必须滚动到底部。
我一直在考虑从头开始制作我自己的 JTextPane 版本,但我想看看你们是否有更简单的解决方案。