阅读HTML时,在JEditorPane中应用ForegroundActions的性能不一致

我正在build立一个使用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> 

有时我可以在编辑器中突出显示一些文本,然后按红色或蓝色button,它可以正常工作,即它会改变颜色。 在其他场合(即,如果closures我的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 ,我无法重现你描述的效果。 如果Swing GUI对象不是在事件派发线程上构build和操作的,则可能会出现这种exception。 该示例相应地使用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(); } }); } }