gpt4 book ai didi

java - 将文本附加到 JTextPane 时,滚动条对于 JTextPane 不可见

转载 作者:行者123 更新时间:2023-12-02 09:47:32 29 4
gpt4 key购买 nike

我在 JScrollPane 中有一个 JTextPane(水平策略从不,垂直策略始终)。我编写了一种在此 JTextPane 中附加文本的方法。现在有一个按钮,单击该按钮时,操作监听器正在运行,执行一些数据操作并更新 JTextPane 上的数据。我正在使用 JScrollPane.update() 方法来刷新附加文本。文本会正确更新,直到达到 JTextPane 的高度。随着添加更多文本,它应该显示垂直滚动条并更新文本。但这并没有发生。相反,当流程从操作监听器方法流出时,整个文本就会显示。

我尝试过更新 JTextPane 和 JScrollPane。但似乎不起作用。

JTextPane txt_message = new JTextPane();
txt_message.setPreferredSize(new Dimension(300,300));
JScrollPane sPane = new JScrollPane(txt_message);
sPane.setHorizontalScrollBarPolicy
(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
sPane.setVerticalScrollBarPolicy
(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
sPane.setPreferredSize(new Dimension(320,320));
pnl_messagePane.add(sPane);
txt_message.setEditable(false);
DefaultCaret caret = (DefaultCaret) txt_message.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);

//some other GUI elements
.....

btn_Run.addActionListener(e->{
for(int i=1; i<100; i++){
appendToPanel(this.txt_message, "dummy text "+i, TextType.SUCCESS);
}

//TextType is an enum defined in code whose value can be SUCCESS, ERROR

});



// Method for appending JTextPanel Text
private void appendToPane(JTextPane tp, String msg, TextType type)
{
Color c = null;
switch(type) {
case ERROR:
c = Color.RED;
break;

case SUCCESS:
c=Color.GREEN;
break;
default:
c = Color.BLACK;
}


StyledDocument doc = tp.getStyledDocument();

SimpleAttributeSet keyWord = new SimpleAttributeSet();
StyleConstants.setForeground(keyWord, c);
StyleConstants.setBold(keyWord, true);

try
{
doc.insertString(doc.getLength(), "\n"+msg, keyWord );
}

catch(Exception e) {
System.out.println(e);
}

tp.update(tp.getGraphics());

this.sPane.update(this.sPane.getGraphics());
}


当循环运行时,它应该将 JTextPane 中的文本更新为
虚拟文本 1
虚拟文本 2
虚拟文本 3
。。.

假设在虚拟文本 10 之后,它达到了 JScrollPane 高度。
现在预期的行为是 --
它应该继续更新新文本,例如
虚拟文本 11
虚拟文本 12
.. 和垂直滚动条应该出现。

但实际行为是 -
它可以正常工作,直到虚拟文本 10(假设 JScrollPane 的高度可以容纳 10 行)。之后 JTextPane 闪烁但没有任何反应,当循环完成时,它会立即显示剩余的 90 行并带有垂直滚动条。

虚拟文本 11
虚拟文本 12


.

我想当我附加越来越多的行时,问题出在 JScrollBar 可见性的某个地方。

如有任何帮助,我们将不胜感激。

最佳答案

Instead, the whole text appears as the flow is out from action listener method.

从监听器调用的代码在事件调度线程 (EDT) 上执行。

因此,正如已经提到的,您的循环代码在 EDT 上执行。 EDT 负责重新绘制 GUI,但只有在主循环执行完毕后才能执行此操作。

it works fine until dummy text 10 (assuming the height of JScrollPane could hold 10 lines). After that the JTextPane flickers but nothing happens

它之所以能工作只是因为您错误地使用了 Swing:

tp.update(tp.getGraphics());
this.sPane.update(this.sPane.getGraphics());

您不应该直接调用 update(...) 方法。当组件需要重新绘制时,Swing 将在内部调用此方法。强制更新会导致闪烁。不要这样做!

要更新文本区域,您需要在单独的线程上执行代码,这样就不会阻塞EDT

实现此目的的一种方法是使用 SwingWorker。它为您创建了线程,并允许您根据需要 publish() 结果到文本 Pane ,以便文本 Pane 在 EDT 上正确更新。

评论部分中提供的 Concurrency 链接中有一个关于如何使用 SwingWorker 的部分,其中包含帮助您入门的工作示例。本教程还解释了 EDT 的工作原理。

关于java - 将文本附加到 JTextPane 时,滚动条对于 JTextPane 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56541865/

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