我在尝试将多个字符串插入到具有 TitledBorder 的 JTextPane 时遇到了一个非常奇怪的问题(这很重要,问题似乎只发生在 TitledBorder 上,其他 Borders 或根本没有 Border 工作正常)来自线程。我的测试代码的(对于这个问题)重要部分如下所示:
JTextPane myTextPane = new JTextPane();
myTextPane.setBorder(new TitledBorder("Some title"));
StyledDocument doc = myTextPane.getStyledDocument();
SimpleAttributeSet sas = new SimpleAttributeSet();
StyleConstants.setForeground(sas, Color.BLACK);
private void insertTwoStrings()
{
new Thread(new Runnable()
{
@Override
public void run()
{
docTest.insertString(docTest.getLength(), "first string ", sas);
docTest.insertString(docTest.getLength(), "second string\n", sas);
}
}).start();
}
现在问题来了: insertTwoStrings() 方法有时可以正常工作,但有时它会以一种锁定整个应用程序的方式非常糟糕地失败(我必须终止进程才能关闭应用程序)。所以我在调试器中打开程序并在那里复制问题,当有问题的线程被锁定时,我暂停它并仔细查看程序计数器位置:
似乎这个 synchronized(this) 是我的问题的原因。这实际上是一个错误还是我犯了某种错误?
如果有人想复制这个,要发生问题,您必须满足以下三个条件:
- 从 Thread将文本插入 JTextPane(即插入其 StyledDocument)
- 在线程中多次调用 StyledDocument.insertString(...) ,而不仅仅是一次
- JTextPane 必须有一个 TitledBorder
执行线程有时仍然可以工作,但时不时会失败并锁定整个程序。