Java 在SwingWorker中打印时不会自动滚动JTextArea

Java 在SwingWorker中打印时不会自动滚动JTextArea,java,swing,scroll,jscrollpane,jtextarea,Java,Swing,Scroll,Jscrollpane,Jtextarea,我的问题是添加了JScrollPane的JTextArea没有滚动到最新打印的行(滚动条保持在顶部)。 需要注意的是,行打印在单独的SwingWorker线程中 然而,如果我在simulation()中去掉了SwingWorker,滚动似乎可以正常工作 有人能给我一个提示如何处理这个问题吗 下面是我正在测试的代码(imports省略): 公共类Test4{ 私有JFrame; 私人JTEXTEXTAREA textArea; 私人JButton btnNewButton; 公共静态void ma

我的问题是添加了
JScrollPane
JTextArea
没有滚动到最新打印的行(滚动条保持在顶部)。
需要注意的是,行打印在单独的
SwingWorker
线程中

然而,如果我在
simulation()
中去掉了
SwingWorker
,滚动似乎可以正常工作

有人能给我一个提示如何处理这个问题吗

下面是我正在测试的代码(
import
s省略):

公共类Test4{
私有JFrame;
私人JTEXTEXTAREA textArea;
私人JButton btnNewButton;
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
Test4 window=newtest4();
window.frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
public Test4()抛出InterruptedException{
初始化();
}
private void initialize()引发InterruptedException{
frame=新的JFrame();
机架立根(100450300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
textArea=新的JTextArea();
textArea.setEditable(false);
JScrollPane scroll=新的JScrollPane(textArea);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL\u SCROLLBAR\u ALWAYS);
frame.getContentPane().add(滚动,BorderLayout.CENTER);
btnNewButton=新的JButton(“测试滚动”);
frame.getContentPane().add(btnNewButton,BorderLayout.NORTH);
addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
模拟();
}
});
}
私有void模拟(){
SwingWorker SwingWorker=新SwingWorker(){
@凌驾
受保护的Void doInBackground()引发异常{
TestOutputStream customOutputStream=新的TestOutputStream(
文本区域);
系统放样(新的打印流(customOutputStream,true,“UTF-8”);
对于(int i=0;i<30;i++){
系统输出打印(“测试”);
}
返回null;
}
};
swingWorker.execute();
}
}
类TestOutputStream扩展了OutputStream{
私有最终ByteArrayOutputStream buf=新ByteArrayOutputStream();
专用最终JTextArea控制台输出;
公共TestOutputStream(JTextArea控制台输出){
超级();
this.consoleOutput=consoleOutput;
}
@凌驾
public void flush()引发IOException{
consoleOutput.append(buf.toString(“UTF-8”);
buf.reset();
}
@凌驾
公共无效写入(int b)引发IOException{
buf.写入(b);
}
}

以下是我正在测试的代码(忽略导入):

为什么??张贴我们可以复制/粘贴/测试的代码。我不使用IDE,不必花时间输入导入

我测试你的代码时,它什么也没做。我在Windows7上使用JDK8

我必须在SwingWorker中的循环之后添加以下内容:

customOutputStream.flush();
未滚动到打印的最新行(滚动条保持在顶部)

它不会滚动,因为文本不会附加到EDT上的文本区域

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
上面的代码对我有用

有关此问题的更多信息,请查看

以下是我正在测试的代码(忽略导入):

为什么??张贴我们可以复制/粘贴/测试的代码。我不使用IDE,不必花时间输入导入

我测试你的代码时,它什么也没做。我在Windows7上使用JDK8

我必须在SwingWorker中的循环之后添加以下内容:

customOutputStream.flush();
未滚动到打印的最新行(滚动条保持在顶部)

它不会滚动,因为文本不会附加到EDT上的文本区域

JTextArea textArea = new JTextArea();
DefaultCaret caret = (DefaultCaret)textArea.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
上面的代码对我有用


查看此问题的更多信息。

刚刚编辑了代码,修改:
System.setOut(新的PrintStream(customOutputStream,true,“UTF-8”)谢谢你的回答,检查一下。
DefaultCaret
也对我有用。非常感谢!刚刚编辑代码,修改:
System.setOut(新的PrintStream(customOutputStream,true,“UTF-8”)谢谢你的回答,检查一下。
DefaultCaret
也对我有用。非常感谢!