即使绘制了新文本,也只设置一次swing应用程序的默认字体

时间:2018-07-05 14:47:29

标签: java swing fonts

我用过Romain Hippeau's answer。为了在首次构建时设置应用程序的默认字体。

public static void setUIFont(javax.swing.plaf.FontUIResource f) {
    java.util.Enumeration keys = UIManager.getDefaults().keys();
    while (keys.hasMoreElements()) {
        Object key = keys.nextElement();
        Object value = UIManager.get(key);
        if (value instanceof javax.swing.plaf.FontUIResource)
            UIManager.put(key, f);
    }

然后调用它:

        setUIFont(new javax.swing.plaf.FontUIResource("Sans", Font.PLAIN, 24));

但是,当将新文本写入到swing应用程序时:即

JTextArea textArea = new JTextArea();
onSomeEventHappening(){
    textArea.setText("Hello world");
}

Hello world以标准的显示字体显示,而我所有其他元素都保留在我希望所有内容保留的字体下。有什么方法可以确保所有添加到应用程序中的新文本都没有更改其字体

enter image description here

上面显示了一个示例,单词"FOOTBALL"已写入其组合框中,因此以Swing的常规字体显示,而我的按钮"Generate one link"以我设置的字体出现。 / p>

下面显示了一个复制和粘贴的示例,即使您在上方设置了字体,如果您单击按钮,标签仍然是Swings原始样式:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class test extends JFrame {
    private static final int WIDTH = 1000;
    private static final int HEIGHT = 700;
    private JTextArea textArea = new JTextArea();


public static void setUIFont(javax.swing.plaf.FontUIResource f) {
    java.util.Enumeration keys = UIManager.getDefaults().keys();
    while (keys.hasMoreElements()) {
        Object key = keys.nextElement();
        Object value = UIManager.get(key);
        if (value instanceof javax.swing.plaf.FontUIResource)
            UIManager.put(key, f);
    }
}
public test(){
    initialize();
}

final ActionListener buttonClick = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        textArea.setText("new Text");
    }
};

public void initialize(){
    new JFrame();
    setBounds(100, 100, 450, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLayout(new GridLayout(1,2));
    setUIFont(new javax.swing.plaf.FontUIResource("Sans", Font.PLAIN, 24));
    JButton button = new JButton("test");

    button.addActionListener(buttonClick);
    this.add(button);
    this.add(textArea);
    setVisible(true);
}

public static void main(String[] args){
    test test1 = new test();
}
}

1 个答案:

答案 0 :(得分:0)

private JTextArea textArea = new JTextArea();
 ...
 setUIFont(new javax.swing.plaf.FontUIResource("Sans", Font.PLAIN, 24));
 ...
 JButton button = new JButton("test");

在更改字体之前,您已经创建了JTextArea。

Swing组件在创建时会获得其UI属性。

因此,您需要在设置字体后创建JTextArea,就像使用JButton一样。

注意:如果在创建组件后更改属性,则需要重置属性。

SwingUtilities.updateComponentTreeUI(frame);
frame.pack();

阅读How to Set the Look and Feel After Startup的Swing教程中的部分,以获得更多信息。