CSS Swing атрибут стиля CSS "класс" использовать в HTMLEditorKit/HTMLDocument
Моя проблема заключается в следующем:
Я пытаюсь добавить функциональность в редактор HTML, который реализован в Java Swing с использованием классов HTMLEditorKit и HTMLDocument. Идея состоит в том, чтобы обеспечить возможность переключения между различными стилями при редактировании текста в редакторе HTML. Различные стили определяют цвета фона / переднего плана, шрифты и тому подобное.
Мне уже удалось загрузить файл таблицы стилей программно. Код для этого выглядит следующим образом:
class HtmlEditor extends JFrame implements Keylistener, MouseListener {
private HTMLDocument m_doc;
private HTMLEditorKit m_kit;
[...]
public HtmlEditor(...) {
[...]
final URL formats = HtmlEditor.class.getResource("/formats.css");
predefStyles = new StyleSheet();
predefStyles.importStyleSheet(formats);
m_kit.getStyleSheet().addStyleSheet(predefStyles);
[...]
}
Файл таблицы стилей выглядит следующим образом:
.style1 { background-color:silver }
.style2 { background-color:aqua }
.style3 { background-color:teal }
С этой таблицей стилей, добавленной в таблицу стилей экземпляра HTMLEditorKit, я уже могу использовать стили при вставке содержимого в редактор HTML с помощью редактора исходного кода (в редакторе исходного кода можно напрямую вставить HTML-код, например, "Styled текст SPAN>"). Чтобы разрешить использование стилей в части WYSIWYG, я добавил JComboBox на панель инструментов редактора, которая отображает имена стилей из "format.css" (ведущий "." Из имен стилей удален). В ActionListener JComboBox я сейчас пытаюсь установить атрибут "класс". Мой код выглядит следующим образом:
cbStyles = new JComboBox<String>(getStyleNames());
cbStyles.setToolTipText("Select Style");
cbStyles.setMaximumSize(null);
cbStyles.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
currStyle = cbStyles.getSelectedItem().toString();
final SimpleAttributeSet attr = new SimpleAttributeSet();
attr.addAttribute(HTML.Attribute.CLASS, currStyle);
m_kit.getInputAttributes().addAttributes(attr);
m_editor.requestFocusInWindow();
}
});
m_toolBar.add(cbStyles);
К сожалению, это не похоже на работу. По крайней мере, после изменения стиля я не применяю его к вводимому впоследствии тексту, и в исходном представлении атрибут "class" не появляется в содержащем HTML-компоненте. Я проверил код в классе HtmlEditor, который управляет настройкой другого шрифта, чтобы выяснить, могу ли я использовать ту же технику, которая используется для изменения шрифта и для моей цели. Соответствующий слушатель действия, прикрепленный к JComboBox, который обеспечивает выбор шрифта, выглядит следующим образом:
cbFonts.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
m_fontName = m_cbFonts.getSelectedItem().toString();
final MutableAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setFontFamily(attr, m_fontName);
m_kit.getInputAttributes().addAttributes(attr);
m_editor.requestFocusInWindow();
}
});
Как мы видим здесь, класс StyleConstants используется для установки атрибута нового шрифта. Что меня озадачивает, так это то, что класс StyleConstants, по-видимому, не обеспечивает метод для установки атрибута "класс". Как видно из его Javadoc, существует множество методов для установки таких атрибутов, как выравнивание, семейство шрифтов, полужирность и т. Д. Возможно, мой подход неверен довольно простым способом. Может быть, я еще не совсем понял концепции использования CSS в HTMLDocument. Любая помощь будет оценена!
Из моего понимания в HTML CSS можно использовать следующим образом:
Элемент