2012-02-17 74 views
8

Tôi có một JTextPane và tôi có một số văn bản trong đó JTextPane. Tuy nhiên, vì tôi đã sử dụng HTML trong Pane, văn bản dường như đã được tự động thay đổi thành Times New Roman.Java - Thay đổi phông chữ trong một JTextPane chứa HTML

Tôi đang cố gắng đặt loại phông chữ trong JTextPane thành phông chữ mặc định của GUI (phông chữ của JTextPane khi không phải HTML). Tuy nhiên tôi không thể chỉ đặt phông chữ thành một phông chữ bởi vì nó khác với hệ điều hành, do đó tôi muốn tìm cách để có phông chữ mặc định và sau đó thay đổi văn bản tôi có phông chữ mặc định.

Để minh họa cách văn bản được đổi thành Times New Roman khi được chuyển đổi, mã sau là định dạng tôi đã sử dụng. Làm thế nào tôi có thể thay đổi nó để đạt được mục tiêu của tôi?

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); 

    } 

} 

Cảm ơn!

Trả lời

7

đơn giản nhất cách có lẽ là một cái gì đó như thế này:

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

Điều đó sẽ cung cấp cho bạn các phông chữ mặc định. Sau đó, chỉ áp dụng nó bằng cách sử dụng CSS:

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

này đã giúp tôi ra với nó, tôi thực hiện một phương pháp mới trong lớp khác để trả lại phông chữ mặc định cho một thành phần và sau đó sử dụng trong mã HTML tương tự như của bạn sở hữu. Cảm ơn bạn. – mino

1

Trình kết xuất html JComponent sử dụng phông chữ của riêng nó chứ không phải phông chữ của JComponent. Để có được thành phần hiển thị như nhau, bạn cần đặt thuộc tính phông chữ trong chuỗi html. Trong số những thứ khác, bạn sẽ cần phải đặt họ phông chữ, kích thước, đậm/nghiêng vv

Ví dụ, bạn có thể làm như sau:

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>"); 

Nó sẽ là khá tầm thường để tạo ra một chức năng thực hiện điều này cho bạn. Vượt qua nó một JComponent và một chuỗi, và nó sẽ tạo ra các văn bản html cho bạn, bao gồm tất cả các thẻ font.

+0

Tôi đã thử phương pháp của bạn nhưng nó dường như không làm việc cho tôi, đã làm nó chính xác như thế nào bạn hiển thị. – mino

+1

là một trong những thẻ pedantic mà về mặt kỹ thuật cần phải được xác định lại bên trong nhiều thẻ khác - bạn không thể chỉ quấn nó xung quanh bên ngoài. Vì vậy, giải pháp này là quá giòn cho nội dung chung. –

22

Sau đây sẽ làm các trick:

pane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, true); 

(Lưu ý rằng JTextPane kéo dài JEditorPane.)

Cập nhật (tháng 8 năm 2016):

Đối với các thiết lập để tồn tại Nhìn & Feel và thay đổi hệ thống (ví dụ: Phông chữ thay đổi trong Bảng điều khiển Windows) dòng có thể được đặt ở đây:

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

(Điều này cũng được gọi là quá trình xây dựng.)

+0

tuyệt vời, cảm ơn! – Mark

Các vấn đề liên quan