2012-12-26 21 views
6

Đối với các ứng dụng swing, cài đặt phông chữ mặc định cho các thành phần trong chủ đề hiện tại và có thể được lấy ra sử dụng UIManager:java đu tối thiểu (hoặc phạm vi cho) kích thước phông chữ cho các ứng dụng khác

public class JavaTesting { 
    public static void main(String[] args) { 
     System.out.println(UIManager.get("Label.font")); 
    } 
} 

Điều này có thể được điều chỉnh trong JAVA_HOME/lib/swing.properties cho hàng loạt các ứng dụng với ví dụ:

swing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel 

hoặc đặt ở dòng lệnh với:

java -Dswing.defaultlaf=javax.swing.plaf.nimbus.NimbusLookAndFeel MyApp 

Hoặc bản thân ứng dụng ghi nhớ giao diện của nó và có giá trị này được lưu ở đâu đó trong cấu hình (tệp). Nó hoạt động, bởi vì ứng dụng có thể thiết lập giao diện cho chính nó, ví dụ:

UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");  

bài này có vẻ tốt đẹp, nhưng các ứng dụng cần thường phông chữ nhỏ hơn (ví dụ như không quan trọng nhắn thanh trạng thái cho Label) hoặc phông chữ lớn hơn (Dán nhãn với một số tiêu đề). Có cách nào được khuyến nghị cho việc này không? Là một người sử dụng của màn hình mật độ cao Tôi đã phải bỏ rất nhiều ứng dụng java, mã sử dụng như thế này - mã nguồn sao chép từ sóc sql:

Font tmp = (Font)UIManager.get("Label.font"); 
if (tmp != null) { 
     Font font = tmp.deriveFont(10.0f); 
     _statusBarFontInfo = new FontInfo(font); 
} 

mã ví dụ này làm cho thanh trạng thái hoàn toàn không đọc được, nhưng hầu hết các thành phần được điều chỉnh theo phông chữ mới, lớn hơn.

Đối với việc tạo ra ứng dụng riêng của tôi, tôi có thể sử dụng một số tỷ lệ (ví dụ 50% đến 150% phông chữ chủ đề), nhưng hardcoding 0,50-1,50 phạm vi trông như một habbit xấu mã hóa là tốt. Và nó không khắc phục được sự cố với các ứng dụng mà tôi không có mã nguồn. Điều này thuộc về chủ đề/L & F (Hãy xem & Cảm giác, giao diện). Ví dụ:

FontUIResource Label_font_resource = (FontUIResource)javax.swing.UIManager.get("Label.font"); 
Font Label_font = Label_font_resource; 
Font Label_font_bigger = Label_font.deriveFont(Label_font.getSize2D() * 1.5f); 

Điều đáng hỏi trước khi tôi thử một số phần mềm xấu xí như các thành phần tùy chỉnh thay thế các giá trị mặc định swing hoặc điều chỉnh Graphics2D.setFont hoặc bất kỳ nội dung đáng sợ nào khác. :-)

Chỉnh sửa: điều duy nhất tồn tại, là biến thể kích thước, chỉ được hỗ trợ bởi chủ đề Nimbus. Giá trị được phép là "nhỏ", "nhỏ", "thông thường", "lớn". Ví dụ:

JComponent mini = new JButton("mini"); 
mini.putClientProperty("JComponent.sizeVariant", "mini"); 

Tuy nhiên, nhìn vào mã nguồn cho chủ đề Nimbus, nó không thể chỉ đơn giản là điều chỉnh các giá trị (ví dụ quy mô đến 150% cho "lớn"), nó thực sự mã hóa cứng!

package javax.swing.plaf.nimbus; 

public final class NimbusStyle extends SynthStyle 
{ 
    public static final String LARGE_KEY = "large"; 
    public static final String SMALL_KEY = "small"; 
    public static final String MINI_KEY = "mini"; 
    public static final double LARGE_SCALE = 1.15D; 
    public static final double SMALL_SCALE = 0.857D; 
    public static final double MINI_SCALE = 0.714D; 

Giá trị này có thể được chỉ thay đổi nội dung bởi người dùng rất tiên tiến (ví dụ sửa hồ bơi liên tục trong JAVA_HOME/lib/rt.jar với chương trình gọi là "rej") - tôi đã cố gắng nó, và nó hoạt động, NHƯNG nó doesn 't làm việc luôn, bởi vì họ thực sự mã hóa cứng (!!) các hằng số ở một số nơi (là thế này chất lượng thực sự tốt nhất - thư viện tiêu chuẩn?), ví dụ:

if ("large".equals(str)) 
{ 
    this.scrollBarWidth = (int)(this.scrollBarWidth * 1.15D); 
    this.incrGap = (int)(this.incrGap * 1.15D); 
    this.decrGap = (int)(this.decrGap * 1.15D); 
} 

Tóm lại: không có, Java nhìn và cảm thấy không ủng hộ điều đó bây giờ. Tôi đề xuất sử dụng tỷ lệ, ví dụ: 0,7 - 1.3 kích thước phông chữ mặc định.

JLabel smallLabel = new JLabel("some text"); 
smallLabel.setFont(smallLabel.getFont().deriveFont(0.8f * smallLabel.getFont().getSize2D())); 
+0

[câu hỏi hay nhất +1] (http://stackoverflow.com/q/9958004/714968) – mKorbel

+0

Thẻ đã xóa "Nimbus". Điều này không liên quan gì tới chủ đề "Nimbus", nó chỉ là một ví dụ. Nó liên quan đến tất cả các chủ đề. – peenut

+0

trong Swing là Look and Feel, không phải chủ đề – mKorbel

Trả lời

1

Thay vì thay đổi Font, Nimbus có sizeVariant cho các thành phần nhỏ, nhỏ, thông thường và lớn. Bài viết này có nhiều ví dụ hơn: Resizing a Component.

myButton.putClientProperty("JComponent.sizeVariant", "mini"); 
0

Điều tôi đã làm trong các ứng dụng Swing là lớp Font. Mỗi thành phần Swing khác cần một phông chữ gọi lớp Font.

import java.awt.Font; 

public class MinesweeperFont { 

    protected static final String FONT_NAME = "Comic Sans MS"; 

    public static Font getBoldFont(int pointSize) { 
     return new Font(FONT_NAME, Font.BOLD, pointSize); 
    } 

} 

Bây giờ trong trường hợp này, tôi chỉ cần một loại phông chữ. Tôi để ứng dụng chọn kích thước phông chữ.

Bạn có thể xác định phương pháp cho từng kích thước phông chữ bạn muốn, có thể gọi chúng là nhỏ, trung bình và lớn, vì vậy bạn có thể thay đổi các phương pháp sau để sử dụng kích thước hoặc loại điểm khác nhau nếu bạn muốn.

Vì toàn bộ ứng dụng của bạn gọi các phương thức tĩnh phông chữ này, bạn chỉ phải thực hiện thay đổi phông chữ ở một nơi.

+0

Tôi đang mô tả giải pháp của bạn trong câu hỏi của tôi là không đạt yêu cầu: xem phần "tỷ lệ" đậm. Tôi hỏi nếu nó có thể được thực hiện TỐT hơn - để chia sẻ cài đặt giữa các ứng dụng Java (như "Nhìn và cảm nhận"), và/hoặc cách sửa nó cho các ứng dụng Java hiện có sử dụng kích thước phông chữ tuyệt đối, không tỷ lệ thuận. – peenut

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