gpt4 book ai didi

java - 快速写入 JEditorPane

转载 作者:行者123 更新时间:2023-11-29 05:43:46 26 4
gpt4 key购买 nike

在下面的代码中,我想在 JEditorPane 上写入 0 到 10000 的数字。但是,JEditorPane 不显示任何内容,除非它完全完成(一次打印所有 0 到 10000)或者操作系统给它时间刷新并显示内容。无论哪种情况,应用程序都会在一段时间内变得无响应,以至于用户认为应用程序已崩溃。无论如何我们可以强制 jEditorPane 显示更新的内容,即使它仍然很忙?我尝试了 invokeAndWait 但在这里没有帮助,因为我们无法从事件调度程序线程调用 invokeAndWait。

换句话说,如果我将 Thread.sleep(0) 替换为 Thread.sleep(50),它可以正常工作并显示打印结果会发生,但加上 50 毫秒的延迟会使它变得非常慢。我只想不时更新 JEditorPane,这样用户就不会认为应用程序崩溃了。 我更喜欢只修改 updateMessages()。这是我的代码:

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
import javax.swing.text.Document;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;

public class CMessageWindowStack {

private static final String MESSAGE = "msg";
private JScrollPane scrollPane;
public JEditorPane editorPane;
private HTMLEditorKit kit;
private String msgBuffer=new String("");
private static CMessageWindowStack window=null;
private static JFrame frameContainer=null;

private CMessageWindowStack()
{
editorPane = new JEditorPane ();
editorPane.setEditable(false);
editorPane.setContentType("text/html");
kit = new HTMLEditorKit();
editorPane.setEditorKit(kit);

StyleSheet styleSheet = kit.getStyleSheet();
styleSheet.addRule("."+MESSAGE+" {font: 10px monaco; color: black; }");

Document doc = kit.createDefaultDocument();
editorPane.setDocument(doc);
scrollPane = new JScrollPane(editorPane);
}
public static CMessageWindowStack getInstance(){
if (null==window)
{window=new CMessageWindowStack();}
return window;
}
/**
* The core
* @param sMessage
* @param sType
*/
private void updateMessages(final String sMessage, final String sType)

{
SwingUtilities.invokeLater( new Runnable() {
public void run() {

String sMessageHTML="";
String sTypeText="";
if (!sMessage.equals("\r\n")){
sTypeText = sType+": ";
}

sMessageHTML = sMessage.replaceAll("(\r\n|\n)", "<br/>");
if (!sMessageHTML.equals("<br/>"))
{
sMessageHTML = "<SPAN CLASS="+sType+">"+ sTypeText+sMessageHTML + "</SPAN>";
}

msgBuffer=msgBuffer.concat( sMessageHTML);
editorPane.setText(msgBuffer);
if ((editorPane.getDocument()).getLength()>1){
editorPane.setCaretPosition((editorPane.getDocument()).getLength()-1);
}
}
});
}

public void setContainerFrame(JFrame jFrame){
frameContainer = jFrame;
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(frameContainer.getContentPane());
frameContainer.getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(scrollPane)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(scrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 217, Short.MAX_VALUE))
);
}

public void setVisible(boolean bVisible){
editorPane.setVisible(bVisible);
scrollPane.setVisible(bVisible);
}

public void printMsg(String sMessage){
String sType = MESSAGE;
updateMessages(sMessage,sType);
}

public void printlnMsg(String sMessage){
sMessage=sMessage.concat("\r\n");
printMsg(sMessage);
}


public static void main(String args[]){
CMessageWindowStack m_LogMgr;
JFrame frame = new JFrame();
m_LogMgr=CMessageWindowStack.getInstance();
m_LogMgr.setContainerFrame(frame);
frame.setVisible(true);
frame.setSize(500, 500);


for(int i=0;i<10000;++i){
try {
Thread.sleep(0);//becomes unresponsive if sleep(0)
} catch (Exception e) {
}
m_LogMgr.printlnMsg(i+"-----------------------");
}

}


}

最佳答案

您可能需要使用 SwingWorker。首先用您的基本 HTML 加载 JEditorPane。然后您需要发布每一行数据。发布数据后,您需要将文本插入编辑器 Pane 。

基本思想是您不能一次创建整个 HTML 字符串。

我一直无法真正理解如何将 JEditorPane 与动态更改的 HTML 一起使用。也许您可以只使用 JTextPane。它支持不同的字体和颜色,并且更容易动态更新。

关于java - 快速写入 JEditorPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547086/

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