Как мой JTextPane может отображать несколько шрифтов?

Я пытаюсь разработать часть более крупного графического интерфейса, который будет форматировать текст, чтобы он выглядел хорошо. Он должен иметь возможность играть с текстом множеством забавных способов. Добавление границ, подчеркивание, то есть все, что я мог бы сделать с текстом в декоративных целях. Подходит ли JTextPane для этой цели?

В моем примере ниже я хочу, чтобы decorateTextPane() отображал две строки текста с другим шрифтом. Но всякий раз, когда я вызываю textPane.setFont(), я меняю шрифт всего существующего текста на панели.

public class OuterClass {
    InnerClass inner = new InnerClass();

    private class InnerClass {
        private JTextPane textPane = new JTextPane()

        public InnerClass() {
            StyledDocument doc = textPane.getStyledDocument();
            SimpleAttributeSet center = new SimpleAttributeSet();
            StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
            doc.setParagraphAttributes(0, doc.getLength(), center, false);
        }
    }

    public void decorateTextPane() {
        inner.textPane.setFont(New Font("Times New Roman", Font.PLAIN, 15));
        inner.textPane.setText("First string");
        inner.textPane.setFont(New Font("Calibri", Font.PLAIN, 15));
        inner.textPane.append("\nSecond string"); //my textPane class defines an append method.
    }
}

person user2651804    schedule 06.04.2014    source источник


Ответы (2)


Вы можете использовать JEditorPane вместо JTextPane, потому что он хорошо подходит для задачи, которую вы хотите выполнить. :)

Из ответа Java JTextPane Изменить шрифт выделенного текста

Под JEditorPane есть Document (и, видимо, JTextPane тоже), который вы получаете с помощью getDocument(). Вы хотите привести это к StyledDocument, если можете, а затем вы можете делать такие вещи, как setCharacterAttributes, с заданным набором символов.

Примеры: http://java.sun.com/docs/books/tutorial/uiswing/components/editorpane.html

person An SO User    schedule 06.04.2014

Мой текущий подход — определение методов useFont() и их использование перед добавлением текста, который должен использовать указанный шрифт. Это работает, и я доволен, но если у кого-то есть лучшие ответы, мне все равно очень интересно :-)

public class OuterClass {
InnerClass inner = new InnerClass();

private class InnerClass {
    private JTextPane textPane = new JTextPane();
    private Font firstFont = new Font("Times New Roman", Font.PLAIN, 18);
    private Font secondFont = new Font("Calibri", Font.PLAIN, 14);
    StyledDocument doc = textPane.getStyledDocument();
    SimpleAttributeSet aSet = new SimpleAttributeSet();

    public InnerClass() {
        StyledDocument doc = textPane.getStyledDocument();
        SimpleAttributeSet center = new SimpleAttributeSet();
        StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER);
        doc.setParagraphAttributes(0, doc.getLength(), center, false);
    }

    public void useFont1() {
        StyleConstants.setFontFamily(aSet, firstFont.getFamily());
        StyleConstants.setFontSize(aSet, firstFont.getSize());
        doc.setParagraphAttributes(0, 0, aSet, false);
    }

    public void useFont2() {
        StyleConstants.setFontFamily(aSet, secondFont.getFamily());
        StyleConstants.setFontSize(aSet, secondFont.getSize());
        doc.setParagraphAttributes(doc.getLength(), 0, aSet, false);
    }
}

public void decorateTextPane() {
    inner.useFont1();
    inner.textPane.setText("First string");
    inner.useFont2();
    inner.textPane.append("\nSecond string"); //my textPane class defines an append method.
}

}

person user2651804    schedule 06.04.2014