2014-12-26 6 views
2

Я создаю редактор, используя JEditorPane, HTMLDocument и HTMLEditorKit. У меня есть панель инструментов, которая имеет различные компоненты для изменения атрибутов стиля редактора. Один из них - JComboBox, чтобы изменить атрибут ZOOM_FACTOR. Код ниже - это код, который выполняется при изменении значения JComboBox.JEditorPane HTMLDocument добавляет p-подразумеваемый в HTML без необходимости, когда setCharacterAttributes называется

final SimpleAttributeSet attrs = new SimpleAttributeSet(); 
    zoomCombo.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      String s = (String) zoomCombo.getSelectedItem(); 
      s = s.substring(1, s.length()); 
      double scale = new Double(s).doubleValue()/100; 
      editorPane.getDocument().putProperty("ZOOM_FACTOR", new Double(scale)); 

      try { 
       StyledDocument doc = (StyledDocument) editorPane.getDocument(); 
       doc.setCharacterAttributes(0, 1, attrs, true); 
       doc.insertString(0, "", null); // refresh 
      } catch (Exception ex) { 
       logger.error("Hata", ex); 
      } 
     } 
    }); 

doc.setCharacterAttributes(0, 1, attrs, true); является линия, где корень моей проблемы начинается. После выполнения этой строки кода <p-implied> добавляется в <head></head> часть HTML text в JEditorPane.getText. И после этого, если произошел какой-то определенный случай событий, мой HTML text будет поврежден. Есть ли способ, как не создавать <p-implied>? Если это не так, что может быть лучшим обходным решением этой проблемы?

PS: В системе JDK Bug есть что-то старое сообщение here. Он сообщается по другой причине, но также показано, что тот же <p-implied> добавляется к <head></head>. Я знаю, что проблема, указанная в этой ссылке, использует JTextPane (подкласс JEditorPane) и метод setCharacterAttributes в классе JTextPane, но этот метод также вызывает тот же метод setCharacterAttributes, который я использовал внутри себя.

ответ

3

Вы используете 0 позицию, но для HTMLDocument позиции принадлежат разделу HEAD (не BODY).

Похоже, вы используете его только для обновления содержимого. Вы можете применить тот же код для конца документа.

doc.setCharacterAttributes(doc.getLength(), 1, attrs, true); 

Таким образом, событие изменения атрибута применяется к ТЕЛО.

+0

Большое спасибо, он работал с небольшим изменением, я изменил строку после этой строки, чтобы обновить компонент. Есть ли источник, чтобы лучше понять HtmlDocument и JEditorPane. Документация даже не достаточно близко. – halil

+0

Я применил инструмент http://java-sl.com/JEditorPaneStructureTool.html, чтобы исследовать структуру и структуру структуры документов – StanislavL