2012-12-26 20 views
6

对于摆动应用中,部件默认字体设置是在当前的主题,并且可以使用UIManager的检索:的Java Swing最小(或范围为)字体大小为其他应用

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

这可以在JAVA_HOME进行调整/用于与应用程序例如范围LIB/swing.properties:

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

或用设定在命令行:

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

或者应用程序本身记住它的外观和感觉,并将此值存储在配置(文件)的某处。它的工作原理,因为应用程序可以设置的外观和感觉本身,如:

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

这一切看起来不错,但应用程序需要经常较小的字体(用于标签如不重要的状态栏消息)或较大的字体(标有一些标题)。 有没有推荐的方法呢? 高密度显示器的用户,我不得不放弃很多的Java应用程序,在使用这样的代码 - 源代码松鼠SQL复制:

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

此示例代码使状态栏完全不可读,但大多数组件被调整为新的更大的字体。

为了创建自己的应用程序,我可能会使用一些(主题字体的例如50%至150%),但硬编码0.50 - 1.50范围看起来作为编码习惯中为好。它不能解决我没有源代码的应用程序的问题。这属于主题/ L & F(看&感觉,外观和感觉)。例如:

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

值得一问之前,我尝试像更换挥杆默认的自定义组件,或Graphics2D.setFont调整,或任何其他可怕的东西一些丑陋的黑客。 :-)

编辑:唯一存在的是尺寸变体,它仅受Nimbus主题支持。允许的值是“小”,“小”,“常规”,“大”。例如:

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

然而,寻找到用于雨云主题的源代码,它不能简单地调整这些值(例如,对于“大”规模至150%),它实际上是硬编码!

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; 

这个值可以通过非常先进的用户只修改(例如编辑常量池在JAVA_HOME/lib /下的节目叫的rt.jar“REJ”) - 我试了一下,它的工作原理,但它不“吨总是工作,因为他们实际上是硬编码(!!)在几个地方的常量(这真的是最好的品质 - 标准库?),例如:

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

底线:没有,Java的样子感觉现在不支持。我建议使用比率,例如0.7 - 1。3的默认字体大小。

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

[nice question +1](http://stackoverflow.com/q/9958004/714968) – mKorbel

+0

删除标签“Nimbus”。这与主题“Nimbus”无关,只是一个例子。它涉及所有主题。 – peenut

+0

在Swing的外观和感觉,没有主题 – mKorbel

回答

1

Nimbus并没有改变Font,而是用于迷你,小型,规则和大型组件的sizeVariant。这篇文章有更多的例子:Resizing a Component

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

我在Swing应用程序中所做的事情是包含一个Font类。每个其他需要字体的Swing组件都调用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); 
    } 

} 

现在在这种情况下,我只需要一种字体类型。我让应用程序选择字体大小。

你可以定义你想每个字体大小的方法,大概叫他们小,中,大,所以你以后可以改变方法,如果你想使用不同的点尺寸或类型。

由于整个应用程序调用这些字体的静态方法,你只需要在一个地方的字体变化。

+0

我在我的问题中描述您的解决方案并不令人满意:请参阅粗体“比例”部分。我问是否可以做的更好 - 为Java应用程序之间共享设置(如“看和感觉”),和/或如何解决它的使用绝对字体大小不成正比现有的Java应用程序。 – peenut

相关问题