java - 读取 HTML 时在 JEditorPane 中应用 ForegroundActions 的性能不一致

标签 java html swing jeditorpane

我正在使用 JEditorPane 构建一个 HTML 编辑器,但我遇到了一些与前台操作不一致的性能问题。下面是我的编辑器的简化版本,它具有三个操作:将字体颜色更改为红色或蓝色,或更改字体大小。现在使用以下 testFile.html 文件:

<html>
  <head><title>Title</title></head>
  <body link="#0000FF" bgcolor="white">
    <font size="4" face="arial" color="black">Some test text</font>
    <font size="3" face="arial" color="black">Some new test text </font>
  </body>
</html>

有时我可以在编辑器中突出显示一些文本,然后按红色或蓝色按钮,效果很好,即它会改变颜色。在其他情况下(即如果我关闭我的 JVM 并再次启动它)颜色不会改变,直到我在同一文本上应用 StyledEditorKit.FontSizeAction

我在应用 ForegroundActions 时是否遗漏了什么?或者这可能是一些 Java 错误?

代码如下:

public class EditorTest extends JFrame{

private JEditorPane editorPane;
    public EditorTest() 
    {
    editorPane = new JEditorPane();     
    editorPane.setContentType("text/HTML");        
    getContentPane().add(editorPane, BorderLayout.CENTER);
    editorPane.setEditorKit(new HTMLEditorKit());


    Action a = new StyledEditorKit.ForegroundAction("RedColor", Color.RED);        
    editorPane.getActionMap().put("RedColor", a);

    JToolBar bar = new JToolBar();

    JButton button = new JButton("blue");
    button.addActionListener(new StyledEditorKit.ForegroundAction (
                        "set-foreground-red", Color.blue));


    bar.add(editorPane.getActionMap().get("font-size-12")).setText("12");
    bar.add(button);
    bar.add(editorPane.getActionMap().get("RedColor")).setText("Red");

    getContentPane().add(bar, BorderLayout.NORTH);
    setSize(650,600);
    setVisible(true);

    File file = new File("testFile.html");
    FileReader reader = null;
    try
    {
        reader = new FileReader(file);
        editorPane.read(reader, null);
    }
    catch (IOException ex){}      
    }
}

最佳答案

使用 sscce下面,我无法重现您描述的效果。如果不在 event dispatch thread 上构造和操作 Swing GUI 对象,则可能会出现此类异常情况.该示例相应地使用了 EventQueue.invokeLater()

StyledEditorTest

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JToolBar;
import javax.swing.text.StyledEditorKit;
import javax.swing.text.html.HTMLEditorKit;

/** http://stackoverflow.com/questions/8523445 */
public class StyledEditorTest extends JFrame {

    public StyledEditorTest() {
        JEditorPane editorPane = new JEditorPane();
        editorPane.setContentType("text/HTML");
        editorPane.setEditorKit(new HTMLEditorKit());
        editorPane.setText("<hr>Welcome to <b>StackOverFlow!</b><hr>");
        JToolBar bar = new JToolBar();
        bar.add(new StyledEditorKit.ForegroundAction("Red", Color.red));
        bar.add(new StyledEditorKit.ForegroundAction("Blue", Color.blue));
        bar.add(new StyledEditorKit.FontSizeAction("12", 12));
        bar.add(new StyledEditorKit.FontSizeAction("14", 14));
        bar.add(new StyledEditorKit.FontSizeAction("16", 16));
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.add(bar, BorderLayout.NORTH);
        this.add(editorPane, BorderLayout.CENTER);
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new StyledEditorTest();
            }
        });
    }
}

关于java - 读取 HTML 时在 JEditorPane 中应用 ForegroundActions 的性能不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8523445/

相关文章:

java - 使用蒙特卡洛方法并行计算 Pi

ArrayList 和 RecyclerView 的 java.lang.OutOfMemoryError

java - 如何检查java类是否包含默认构造函数?

html - CSS Hover 在本地工作,但在开发服务器上不工作

javascript - 如何在 JavaScript 中获取当前 Windows 用户的名称

java - 在 Jpanel 的多个实例上共享类的实例

java - 在 String 方法中返回时间(int)

javascript - 创建连接两个 DIV 的线

java - GUI 表单设计数据绑定(bind)的优缺点

java - 如何设置 JPanel 中 GeneralPath 的位置?