Java - изменить шрифт в JTextPane, содержащем HTML - PullRequest
9 голосов
/ 18 февраля 2012

У меня есть 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 ]

22 голосов
/ 05 ноября 2013

Следующие действия помогут:

 pane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true);

(обратите внимание, что JTextPane расширяется JEditorPane.)

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

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

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

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

8 голосов
/ 18 февраля 2012

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

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

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

pane.setText("<html><body style=\"font-family: " + fontfamily + "\"<b>This is some text!</b></html>");
1 голос
/ 18 февраля 2012

В рендерере HTML JComponent используется собственный шрифт, а не шрифт 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-текст для вас, включая все теги шрифта.

...