JTextPane - фраза с двумя стилями - PullRequest
7 голосов
/ 02 октября 2011

Я только что столкнулся с интересной вещью.

Я менял выбранный стиль текста. Дело в том, что когда я меняю стиль для ОДНОГО СЛОВА по одному, это нормально, но затем, если я выбираю целую стилизованную фразу и меняю цвет ее шрифта, вся фраза становится ОДНОЙ ( первый стиль в выделенном тексте ) только :(

Вот фрагмент проблемы

  private void setFontColorStyle()
    {
        JTextPane editor=this.getTextPane();
        String text=this.getTextPane().getSelectedText();

        StyledDocument doc=(StyledDocument) editor.getDocument();
        int selectionEnd=this.getTextPane().getSelectionEnd();
        int selectionStart=this.getTextPane().getSelectionStart();


        Element element=doc.getCharacterElement(selectionStart);
        AttributeSet as = element.getAttributes();

        String family = StyleConstants.getFontFamily(as);
        int fontSize = StyleConstants.getFontSize(as);
        boolean isBold=StyleConstants.isBold(as);
        boolean isItalic=StyleConstants.isItalic(as);
        boolean isUnderlined=StyleConstants.isUnderline(as);

        StyleContext context = new StyleContext();
        Style style;

        this.getTextPane().replaceSelection("");

        style = context.addStyle("mystyle", null);
        style.addAttribute(StyleConstants.FontSize, fontSize);
        style.addAttribute(StyleConstants.FontFamily, family);
        style.addAttribute(StyleConstants.Foreground, this.fontColor);
        style.addAttribute(StyleConstants.Bold, isBold);
        style.addAttribute(StyleConstants.Italic, isItalic);
        style.addAttribute(StyleConstants.Underline, isUnderlined);

        this.getTextPane().replaceSelection("");
        try {
            this.getTextPane().getStyledDocument().insertString(selectionEnd - text.length(), text, style);
        } catch (BadLocationException ex) {

        }
    }

А вот смелый код метода создания ... () Курсив и подчеркнута все та же логика, так что, я думаю, она вполне понятна

private void setFontBoldStyle()
    {
         if(this.getTextPane().getSelectedText()!=null)
        {

        String text = this.getTextPane().getSelectedText();
        int selectionStart=this.getTextPane().getSelectionStart();
        int selectionEnd=this.getTextPane().getSelectionEnd();






        StyleContext context = new StyleContext();
        Style style;


        Element element=doc.getCharacterElement(selectionStart);
        Enumeration en=doc.getStyleNames();

        AttributeSet as = element.getAttributes();

        /**
         * Get style from history...
         */
        String family = StyleConstants.getFontFamily(as);
        int fontSize = StyleConstants.getFontSize(as);
        Color currentColor=StyleConstants.getForeground(as);
        boolean isBold=StyleConstants.isBold(as)?false:true;
        boolean isItalic=StyleConstants.isItalic(as);
        boolean isUnderlined=StyleConstants.isUnderline(as);

        String styleName=String.valueOf(Math.random());

        style = context.addStyle(styleName, null);
//        style.addAttribute(StyleConstants.FontSize, fontSize);
//        style.addAttribute(StyleConstants.FontFamily, family);
        style.addAttribute(StyleConstants.Foreground, currentColor);
        style.addAttribute(StyleConstants.FontFamily, family);
        style.addAttribute(StyleConstants.FontSize, fontSize);
        style.addAttribute(StyleConstants.Bold, isBold);
        style.addAttribute(StyleConstants.Italic, isItalic);
        style.addAttribute(StyleConstants.Underline, isUnderlined);

        this.getTextPane().replaceSelection("");



        try {
            this.getTextPane().getStyledDocument().insertString(selectionEnd - text.length(), text, style);
        } catch (BadLocationException ex) {

        }

        }//if end...


    }

Вот код вызова метода, выделенный жирным шрифтом:

private void setFontBold()
    {
        this.setFontBoldStyle(); 
    }

... и вызов метода цвета

 private void setFontColor(Color fontColor)
    {
        this.fontColor=fontColor;
        this.setFontColorStyle();

    }

... и слушатели действий (жирным шрифтом) ...

 private void boldButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           
         this.getTextPane().requestFocusInWindow();
         this.setFontBold();
    }                                          

... и для цвета

private void colorButtonActionPerformed(java.awt.event.ActionEvent evt) {                                            

       this.getTextPane().requestFocusInWindow();

       ColorDialog colorEditor=new ColorDialog();

      //returns rgb color...
       Color color=colorEditor.getSelectedColor(this.getDialog(), true,false);


       if(color==null){
           JOptionPane.showMessageDialog(this.getDialog(), "null color");
           return;
       }

       this.setFontColor(color);
    }                                           

Мне очень нужен ваш совет о том, как сохранить выбранные стили текста без изменений (например, жирный шрифт или семейство шрифтов), когда я хочу, например, изменить совершенно другой выбранный цвет текста в стилизованном виде?

Чтобы быть более понятным ...

Например, у меня есть текст

Мой Привет Мир это не красиво:)

Затем я выбираю всю фразу и меняю ее цвет с черного на красный. Следующий текст становится красным, но вся фраза становится жирной в соответствии с первым стилем. Но дело в том, что было бы интересно сохранить стили, выделенные жирным шрифтом и курсивом, но в то же время иметь фразу красного цвета :) Очень просто, но я только что запутался, как управлять несколькими стилями в рамках выделенной области текста?

Любой полезный комментарий приветствуется

Ответы [ 2 ]

3 голосов
/ 02 октября 2011

Используйте this.getTextPane (). GetStyledDocument (). SetCharacterAttributes ()

3 голосов
/ 02 октября 2011

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

Приложение: TextComponentDemo опирается на предварительно определенные Action объекты для обработки задач редактирования. Для удобства StyledEditorKit содержит серию вложенных классов, производных от StyledTextAction. В качестве конкретного примера, вот как можно добавить AlignmentAction к Style меню TextComponentDemo в методе createStyleMenu():

protected JMenu createStyleMenu() {
    JMenu menu = new JMenu("Style");

    Action action = new StyledEditorKit.AlignmentAction(
        "left-justify", StyleConstants.ALIGN_LEFT);
    action.putValue(Action.NAME, "Left");
    menu.add(action);
    menu.addSeparator();
    ...
}

Остальные (произвольные) имена действий выравнивания определены конфиденциально в StyledEditorKit.

Приложение: setCharacterAttributes() - это обычная процедура, используемая вложенными действиями редактирования. Он вызывает метод с тем же именем в StyledDocument, как предложено @ StanislavL.

Приложение: я не могу воспроизвести эффект, который вы описываете. Когда я устанавливаю цвет выделения, атрибуты стиля остаются неизменными.

Добавление: действия StyledEditorKit работают так же хорошо, как JButton или JToolBar.

new JButton(new StyledEditorKit.ForegroundAction("Red", Color.red))

TextComponentDemo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...