Java-изменение шрифта в JTextPane, содержащем HTML

У меня есть JTextPane, и у меня есть текст в этом JTextPane. Однако, поскольку я использовал HTML в панели, текст, похоже, был автоматически изменен на Times New Roman.

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

чтобы продемонстрировать, как текст заменяется на Times New Roman при преобразовании, следующий код-это формат, который я использовал. Как изменить его, чтобы достичь своей цели?

import javax.swing.JFrame;
import javax.swing.JTextPane;


public class GUIExample {

    public static void main(String[] args) {

        JFrame frame = new JFrame("My App");
        frame.setSize(300,300);
        JTextPane pane = new JTextPane();
        pane.setContentType("text/html");
        pane.setText("<html><b>This is some text!</b></html>");
        frame.add(pane);

        frame.setVisible(true);

    }

}

спасибо!

3 ответов


самый простой способ, вероятно, что-то вроде этого:

string fontfamily = pane.getFont().getFamily();

это даст вам шрифт по умолчанию. Затем просто примените его с помощью CSS:

pane.setText("<html><body style=\"font-family: " + fontfamily + "\"<b>This is some text!</b></html>");

следующее сделает трюк:

 pane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);

(обратите внимание, что JTextPane выходит JEditorPane.)

Обновление (Август 2016):

для настройки, чтобы выжить внешний вид и системные изменения (Например, шрифты изменены в Панели управления Windows) линия может быть помещена здесь:

  @Override
  public void updateUI() {
      super.updateUI();
      putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);
  }

(Это также называется во время строительства.)


jcomponent HTML renderer использует свой собственный шрифт, а не jcomponent. Чтобы заставить компонент отображать то же самое, вам нужно установить атрибуты шрифта в строке html. Помимо прочего, вам нужно будет установить семейство шрифтов, размер, жирный / курсив и т. д.

в качестве примера вы можете сделать следующее:

JTextPane pane = new JTextPane();
Font font = pane.getFont();
pane.setContentType("text/html");
pane.setText("<html><font face=\"" + font.getFamily() + "\" size=\"" + font.getSize() + "\"></font>This is some text!</html>");

было бы довольно тривиально, чтобы создать функцию, которая делает это для вас. Передайте ему JComponent и строку, и он создаст текст html для вас, включая все теги шрифтов.