スレッドから TitledBorder を持つ JTextPane に複数の文字列を挿入しようとすると、非常に奇妙な問題が発生しました (これは重要です。問題は、特に TitledBorder でのみ発生するようで、他の境界線または境界線がまったく機能しないようです)。(この問題の) テスト コードの重要な部分は次のようになります。
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() メソッドは時々うまく動作しますが、アプリケーション全体をロックする方法で非常にひどく失敗することもあります (アプリケーションをシャットダウンするにはプロセスを強制終了する必要があります)。そこで、デバッガーでプログラムを開き、そこで問題を再現しました。問題のあるスレッドがロックされたときに中断し、プログラム カウンターの位置を詳しく調べました。
この同期(これ)が私の問題の原因のようです。これは実際にはバグですか、それとも私は何らかの間違いを犯していますか?
誰かがこれを再現したい場合、問題が発生するには、次の 3 つの基準をすべて満たす必要があります。
- Thread からJTextPane (つまり、StyledDocument) にテキストを挿入する
- StyledDocument.insertString(...) をスレッド内で 1 回だけでなく複数回呼び出す
- JTextPane には TitledBorder が必要です
スレッドの実行はまだ機能する場合がありますが、時々失敗してプログラム全体がロックされます。