我在某处有几千行代码,并且我注意到当我对其进行过多更新时,我的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版本,但是我想看看你们是否有一个更简单的解决方案。
错误的部分原因是您正在从事件线程外部访问Swing组件!是的,setText()是线程安全的,但是Swing方法不是线程安全的,除非明确声明它们是这样的。因此,setCaretPosition()不是线程安全的,必须从事件线程进行访问。这几乎可以肯定是您的应用程序最终冻结的原因。
注:
JTextPane
继承其setText()
从方法JEditorPane
和setCaretPosition
从方法JTextComponent
,这也解释了在上一节中的链接不会去JTextPane
的JavaDoc页面。
为了确保线程安全,您实际上至少需要setCaretPosition()
从事件线程中进行调用,您可以使用以下代码执行此操作:
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
a.setText(b.toString());
a.setCaretPosition(b.length());
}
}
并且由于您必须setCaretPosition()
从事件线程中进行调用,因此您最好也setText()
从同一位置进行调用。
您可能不需要手动设置插入标记的位置。查阅JavaDoc for
JTextComponent中的“
Caret Changes”部分。
最后,您可能需要查看一系列两篇文章:
目前,我正在尝试使用SwingWorker构建Swing应用程序,以不断更新面板。 我想在这里完成的是从数据库加载数据,每个数据都将作为面板中的图标发布。图标的颜色基于严重程度字段的值。例如: 示例数据在这张图片中,我有12个对象_id A001的数据。doInBackground()方法中的函数将循环12次,并调用publish()函数在面板中显示图标。图标的颜色基于每个对象id的严重性字段的最
我对JS的反应有点陌生。我有两个问题。我来了 现在我要做的是,当应用程序组件挂载时,我生成一个对后端服务器的ajax调用,当它返回时,它更新道具,并设置状态,这样子组件也会重新呈现,但子组件不会重新呈现。谁能告诉我出了什么问题。 问题2 现在让我们假设我将进入组件二路由,它将呈现组件二,我在应用程序组件中生成一个ajax调用,根据ajax调用返回的数据,我在应用程序组件中设置了一些道具,我还希望组
问题内容: 我有一个问题要Ajax更新ui:repeat。更新是从ui:repeat外部的commandButton触发的(请参见下面的代码)。需要可变的 priceHour 来计算其他价格(周,Monat ..) 当我单击按钮时,什么也没有发生,并且ui:repeat和价格未更新。怎么了? 我也尝试过 更新“ myForm:alvs” , 更新“:myForm:alvs” :什么都没有! 我正在
问题内容: 我在JScrollPane中有一个带有自定义表的Swing表单(它只是一个JPanel,而不是JTable子类),并且我试图将其打印出来。如果仅将整个框架发送给打印机,则滚动窗格将被剪切,并且如果将框架调整为滚动窗格的内容大小,则某种内部障碍将使JFrame的高度超过1100像素。 另一种选择是在不将对话框附加到根JFrame的情况下创建对话框的内容窗格,因为在这种情况下,JPanel
我在Java中的JLabel存在一个渲染问题:我使用oberver observable模式,当我的模型通知我的视图JLabel已经更改了JLabel的内容,或者特别是在我的JLabel区域中显示的内容是随机的时。有时它渲染另一个面板中按钮的一部分,有时它渲染我在视图的其他组件中设置的颜色!但是,如果我最小化然后最大化我的帧,所有的渲染都是正确的。 对不起,我的英语不好。 EDIT这是我的JPan
我正在做这个康威的生活游戏react项目,它工作得很好,但当我添加最后几个按钮来清除棋盘和其他一些功能时,react给了我这个错误 从代码片段来看,它向我展示了Clear()函数似乎是这里的问题所在,但我认为我没有在渲染()中设置状态来触发无限循环。这里是Clear和