Как я могу запретить JTextPane сбрасывать настройки шрифта, если исходный текст заканчивается переводом строки? - PullRequest
1 голос
/ 09 марта 2019

Я столкнулся с проблемой с JTextPane.Код, с которым я работаю, устанавливает ряд атрибутов шрифта, таких как BOLD, ITALIC и т. Д. Но если исходный текст заканчивается одним переводом строки, и пользователь нажимает на последнюю строку или отправляется на последнюю строку,настройки шрифта по умолчанию отображаются для любого дополнительного текста, который вводит пользователь.

В частности, этот текст работает так, как я и ожидал: jTextPane.setText (String.format ("Test This"));.

Этот текст не:
jTextPane.setText (String.format ("Test This% n% n% n"));

Я думаю, что JTextPane может посчитать это новым абзацем.Если это так, я бы хотел либо

a.) Знать, как установить универсальный шрифт, который применяется ко всем абзацам экземпляра JTextPane.

или

b.) Рассказатьэкземпляр JTextPane, чтобы рассматривать всю его редактируемую область как один абзац.

Вот игрушечная программа, чтобы показать вам, что я имею в виду.Если вы запустите это и начнете печатать в конце текста, шрифт будет таким, какой по умолчанию будет ваша реализация Swing.Я также попытался установить модель документа JTextPane и использовать экземпляр Font в конструкторе JTextPane.Результаты одинаковы.

Другая альтернатива - вместо этого использовать экземпляр JTextArea, но это очень сложный код, и я не решаюсь внести изменения, которые могут нарушить какую-то другую область приложения, чем та, с которой я работаюдюймы

import javax.swing.*;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import java.awt.*;

public class JTextPaneExampleOne {
    public static void main(String args[]) {
        JFrame frame = new JFrame("JTextPane Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container cp = frame.getContentPane();
        JTextPane pane = new JTextPane();

        String welcomeString = String.format("Welcome%n%n%nStranger!%n%n%n");
        pane.setText( welcomeString );

        pane.invalidate();
        SimpleAttributeSet attributeSet = new SimpleAttributeSet();
        StyleConstants.setBold(attributeSet, true);
        StyleConstants.setItalic(attributeSet, true);
        StyleConstants.setForeground(attributeSet, Color.red);

        pane.setSelectionStart( 0 );
        pane.setSelectionEnd( pane.getText().length() );
        pane.setParagraphAttributes( attributeSet, true );

        pane.setSelectionStart( pane.getText().length() );

        pane.validate();

        JScrollPane scrollPane = new JScrollPane(pane);
        cp.add(scrollPane, BorderLayout.CENTER);

        frame.setSize(400, 300);
        frame.setVisible(true);
    }
}

1 Ответ

0 голосов
/ 23 мая 2019

a.) Знать, как установить универсальный шрифт, который применяется ко всем абзацам экземпляра JTextPane.

В этом случае вы можете использовать JTextPane # setLogicalStyle(Стиль) :

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class JTextPaneExampleOne2 {
  public Component makeUI() {
    JTextPane pane = new JTextPane();

    Style def = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE);
    Style body = pane.getStyledDocument().addStyle("body", def);
    StyleConstants.setBold(body, true);
    StyleConstants.setItalic(body, true);
    StyleConstants.setForeground(body, Color.RED);
    pane.setLogicalStyle(body);

    String welcomeString = String.format("Welcome%n%n%nStranger!%n%n%n");
    pane.setText(welcomeString);

//     SimpleAttributeSet attributeSet = new SimpleAttributeSet();
//     StyleConstants.setBold(attributeSet, true);
//     StyleConstants.setItalic(attributeSet, true);
//     StyleConstants.setForeground(attributeSet, Color.RED);
//
//     pane.setSelectionStart(0);
//     pane.setSelectionEnd(pane.getText().length());
//     pane.setParagraphAttributes(attributeSet, true);
//     pane.setSelectionStart(pane.getText().length());

    return new JScrollPane(pane);
  }

  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame("JTextPane Example");
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new JTextPaneExampleOne2().makeUI());
      f.setSize(400, 400);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}
...