Как мне легко редактировать стиль выделенного текста в JTextPane?
Вопрос
Как мне легко редактировать стиль выделенного текста в JTextPane?Кажется, не так уж много ресурсов по этому поводу.Даже если вы сможете направить меня на хороший ресурс по этому вопросу, я буду очень признателен.
Кроме того, как мне получить текущий стиль выделенного текста?Я пытался styledDoc.getLogicalStyle(textPane.getSelectionStart());
но, похоже, это не работает.
Решение
Взгляните на следующий код в этом вставке:
http://pbin.oogly.co.uk/listings/viewlistingdetail/d6fe483a52c52aa951ca15762ed3d3
Пример отсюда:
http://www.java2s.com/Code/Java/Swing-JFC/JTextPaneStylesExample3.htm
Похоже, вы можете изменить стиль, используя следующее в прослушивателе действий:
final Style boldStyle = sc.addStyle("MainStyle", defaultStyle);
StyleConstants.setBold(boldStyle, true);
doc.setCharacterAttributes(0, 10, boldStyle, true);
Он устанавливает стиль текста между заданным смещением и длиной в определенный стиль.
Более подробную информацию можно найти в полной версии Pastebin.Хотя это должно решить вашу проблему.
Другие советы
Вот фрагмент кода, чтобы вставить форматированный «Привет, мир!» строка в JEditorPane
:
Document doc = yourEditorPane.getDocument();
StyleContext sc = new StyleContext();
Style style = sc.addStyle("yourStyle", null);
Font font = new Font("Arial", Font.BOLD, 18);
StyleConstants.setForeground(style, Color.RED);
StyleConstants.setFontFamily(style, font.getFamily());
StyleConstants.setBold(style, true);
doc.insertString(doc.getLength(), "Hello World!", style);
Самый простой способ манипулировать текстовыми панелями — использовать наборы редакторов и связанные с ними действия.Вы можете найти демо-версию этого в ЯДК образцы (под jdk\demo\jfc\Stylepad).
Пример кода, который устанавливает Styled EditorKit и использует FontSizeAction манипулировать текстом:
public static void main(String[] args) {
// create a rich text pane
JTextPane textPane = new JTextPane();
JScrollPane scrollPane = new JScrollPane(textPane,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// install the editor kit
StyledEditorKit editorKit = new StyledEditorKit();
textPane.setEditorKit(editorKit);
// build the menu
JMenu fontMenu = new JMenu("Font Size");
for (int i = 48; i >= 8; i -= 10) {
JMenuItem menuItem = new JMenuItem("" + i);
// add an action
menuItem
.addActionListener(new StyledEditorKit.FontSizeAction(
"myaction-" + i, i));
fontMenu.add(menuItem);
}
JMenuBar menuBar = new JMenuBar();
menuBar.add(fontMenu);
// show in a frame
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.setJMenuBar(menuBar);
frame.setContentPane(scrollPane);
frame.setVisible(true);
}
(Кончик:если вы хотите использовать ШрифтСемействоДействие, посмотри на GraphicsEnvironment.getAvailableFontFamilyNames() и логические названия семейств шрифтов.)
Я бы порекомендовал обратить внимание на Sun. Учебник по Java о панелях редактора.
Ок, вау.Сложный вопрос.Так что я не нашел способа получить стиль данного персонажа.Однако вы можете получить MutableAttributeSet для данного символа, а затем проверить, входит ли стиль в этот набор атрибутов.
Style s; //your style
Element run = styledDocument.getCharacterElement(
textPane.getSelectionStart() );
MutableAttributeSet curAttr =
( MutableAttributeSet )run.getAttributes();
boolean containsIt = curAttr.containsAttributes( s );
Одна из проблем с получением стиля для диапазона символов заключается в том, что к этому диапазону может быть применено более одного стиля (пример:вы можете выделить текст, часть которого выделена жирным шрифтом, а часть нет).
Чтобы обновить выделенный текст, вы можете:
Style s; //your style
JTextPane textPane; //your textpane
textPane.setCharacterAttributes( s, false );
Да, и похоже, что функция getLogicalStyle не работает, потому что она возвращает стиль по умолчанию (или, может быть, просто стиль) для абзаца, содержащего p, а не стиль символа в p.