2013-04-29 34 views
10

Có ai biết cách để JTextArea hiển thị kích thước cố định phông chữ trên tất cả các nền tảng không?Nhận JTextArea hiển thị phông chữ có chiều rộng cố định mà không cần chống răng cưa

Tôi muốn tạo một trình soạn thảo mã đơn giản với chức năng lưu/mở, đơn giản, nhưng tôi muốn nhận phông chữ là kích thước cố định, tốt nhất là chuyển phát nhanh mới.

Vấn đề là chuyển phát nhanh mới là độc quyền rõ ràng, và không duy nhất là nó không được cài đặt theo mặc định trên nhiều hệ thống, nhưng trên hầu hết các hệ thống hiện đại, nó được thiết lập để ClearType được mặc định, mà làm cho nó trông giống như rác .

Tôi bị cám dỗ tạo JPanel của riêng mình bằng bản cập nhật và vẽ tạo lại JTextArea và lưu phông chữ dưới dạng bitmap có kích thước cố định, nhưng cách tiếp cận này có vẻ ngớ ngẩn và tốn thời gian.

Tôi muốn bao gồm phông chữ có kích thước cố định miễn phí cho dự án và sử dụng phông chữ đó trên tất cả các nền tảng, có thể xuất hiện. Tuy nhiên, các hệ thống hiện đại dường như buộc tất cả các phông chữ trơn tru, mà tôi sẽ muốn ngăn không cho nó hoạt động.

Đáng buồn thay, có vẻ như Swing tự động tuân theo tùy chọn hệ thống vì vậy mà không phá hủy cài đặt của người dùng, có vẻ như không có gì xảy ra. Vì vậy, trong ngắn hạn, là có một cách để có được JTextArea để hiển thị một phông chữ cố định chiều rộng và tắt font làm mịn/antialiasing (hoặc ít nhất là chuyển đổi), hoặc là nhiệm vụ này không thể sử dụng swing?

Cảm ơn trước!

Trả lời

23

Bạn có thể sử dụng phông chữ lôgic "monospaced". Mặc dù nó đảm bảo có phông chữ có cùng kích thước cho tất cả các ký tự, nhưng nó sẽ không giống nhau trên tất cả nền tảng.

import java.awt.Font; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

public class TestTextArea { 

    private void initUI() { 
     JFrame frame = new JFrame("test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JTextArea textArea = new JTextArea(24, 80); 
     textArea.setFont(new Font("monospaced", Font.PLAIN, 12)); 
     frame.add(new JScrollPane(textArea)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestTextArea().initUI(); 
      } 
     }); 

    } 

} 

Hoặc, bạn có thể tra cứu phông chữ "miễn phí" đáp ứng nhu cầu của mình, nhúng phông chữ đó bằng mã và tải nó bằng java.awt.Font.createFont(int, InputStream).

+0

Cảm ơn, câu trả lời cho câu hỏi đó, nhưng tôi vẫn tò mò nếu tôi có thể đảm bảo rằng phông chữ được bảo vệ đơn nhất sẽ không bị chống răng cưa. Điều này có thể không? – Dmitry

+0

@ Dmitry Có một số cách để tắt tính năng chống răng cưa: 1) ['System.setProperty (" awt.useSystemAAFontSettings "," false ");'] (http://docs.oracle.com/javase/6/docs /technotes/guides/2d/flags.html#aaFonts) 'System.property (" swing.aatext "," false "); 2) Bạn có thể đặt RenderingHints trên đối tượng 'Graphics' của phương thức' paintComponent' để tắt TEXT_ANTI_ALIASING ('((Graphics2D) g) .setRenderingHint (RenderingHints.KEY_TEXT_ANTIALIASING, Boolean.FALSE); 'nhưng bạn sẽ không có một đảm bảo tuyệt đối rằng ai đó sẽ không thay đổi điều đó sau đó. –

+0

Tôi không lo lắng về việc thay đổi mật khẩu, tôi lo lắng về các cài đặt mặc định :). Cảm ơn rất nhiều! – Dmitry

1

tôi đến gần một giải pháp bằng cách sử dụng JTextPane thay vì JTextArea bằng cách thiết lập các kiểu nội dung của JTextPane để text/html và thiết lập các văn bản như một nội dung html.

JtextPane textPane; 
String text; 

// initialization 

textPane.setContentType("text/html"); 
textPane.setText("" 
     + "<html>" 
     + "<body>" 
     + "<p>" 
     + "<tt>"+text.replaceAll(" ", "&nbsp;").replaceAll("\n", "<br>")+"</tt>" 
     + "</p>" 
     + "</body>" 
     + "</html>"     
     + ""); 

<tt> thẻ được làm cho văn bản monospaced và tất cả các không gian màu trắng và ký tự dòng mới của text đã thay thế bằng html space entity<br> thẻ, tương ứng. Tôi đã thử nghiệm đầu ra trong cả hai hệ điều hành Windows và Ubuntu và chúng giống nhau.

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