Как легко изменить стиль выделенного текста в JTextPane?

Как легко изменить стиль выделенного текста в JTextPane? Ресурсов по этому поводу не так много. Даже если вы можете направить меня к хорошему ресурсу по этому поводу, я буду очень признателен.

Кроме того, как мне получить текущий стиль выделенного текста? Я пробовал styledDoc.getLogicalStyle(textPane.getSelectionStart());, но похоже, что это не работает.


person Evan Fosmark    schedule 19.04.2009    source источник


Ответы (5)


Взгляните на следующий код в этом pastebin:

http://pbin.oogly.co.uk/listings/view

Пример отсюда:

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 для получения более подробной информации. Однако это должно решить вашу проблему.

person Jon    schedule 20.04.2009

Вот фрагмент кода для вставки отформатированного "Hello World!" строка в 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);
person JRL    schedule 20.04.2009
comment
Я не знаю, почему это было отклонено, потому что это самый правильный ответ здесь! - person Steve McLeod; 17.09.2009

Самый простой способ манипулировать текстовыми панелями - использовать редактор комплекты и связанные с ними действия. Вы можете найти демонстрацию этого в примерах JDK (в разделе jdk \ demo \ jfc \ Stylepad).

Пример кода, устанавливающего StyledEditorKit и использует 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);
  }

(Совет: если вы хотите использовать FontFamilyAction, посмотрите GraphicsEnvironment.getAvailableFontFamilyNames () и логические названия семейств шрифтов.)

person McDowell    schedule 02.05.2009
comment
Хороший пример, но у меня вопрос. Как мне получить текст со стилем и как сохранить этот текст со стилем в базе данных? - person Krismorte; 04.07.2016

Я бы порекомендовал взглянуть на Учебник по Java от Sun по поводу панелей редактора.

person hbw    schedule 20.04.2009

Хорошо, вау. Тяжелый вопрос. Итак, я не нашел способа получить стиль данного персонажа. Однако вы можете получить 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.

person Joseph Gordon    schedule 01.05.2009