Java 更改JPanel及其所有元素的字体大小
我试图创建一个Swing面板,其元素的字体大小与Swing应用程序的其余部分不同。最初,对几个组件使用Java 更改JPanel及其所有元素的字体大小,java,swing,Java,Swing,我试图创建一个Swing面板,其元素的字体大小与Swing应用程序的其余部分不同。最初,对几个组件使用setFont,不会带来任何问题。现在我有几个组件(以及它们的所有子组件),所以这个解决方案是不切实际的 我搜索了有关更改swing组件的默认UI属性的信息。我发现主要是使用UIManager,它可以全局更改属性。这对我不起作用,因为我想保留所有其他面板的当前字体设置 目前(由于我不喜欢在没有先尝试的情况下发布),我有一个这样的算法: public static void fixFont(Con
setFont
,不会带来任何问题。现在我有几个组件(以及它们的所有子组件),所以这个解决方案是不切实际的
我搜索了有关更改swing组件的默认UI属性的信息。我发现主要是使用UIManager,它可以全局更改属性。这对我不起作用,因为我想保留所有其他面板的当前字体设置
目前(由于我不喜欢在没有先尝试的情况下发布),我有一个这样的算法:
public static void fixFont(Container c) {
c.setFont(c.getFont().deriveFont(10.0f));
Component[] comp = c.getComponents();
for (int i=0;i<comp.length;++i) {
if (comp[i] instanceof Container) {
fixFont((Container) comp[i]);
} else {
comp[i].setFont(comp[i].getFont().deriveFont(10.0f));
}
}
}
publicstaticvoidfixfont(容器c){
c、 setFont(c.getFont().deriveFont(10.0f));
Component[]comp=c.getComponents();
对于(int i=0;i您可以使用以下技巧:
import java.awt.*;
public class FrameTest {
public static void setUIFont(FontUIResource f) {
Enumeration keys = UIManager.getDefaults().keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
Object value = UIManager.get(key);
if (value instanceof FontUIResource) {
FontUIResource orig = (FontUIResource) value;
Font font = new Font(f.getFontName(), orig.getStyle(), f.getSize());
UIManager.put(key, new FontUIResource(font));
}
}
}
public static void main(String[] args) throws InterruptedException {
setUIFont(new FontUIResource(new Font("Arial", 0, 20)));
JFrame f = new JFrame("Demo");
f.getContentPane().setLayout(new BorderLayout());
JPanel p = new JPanel();
p.add(new JLabel("hello"));
p.setBorder(BorderFactory.createTitledBorder("Test Title"));
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setVisible(true);
}
}
产生:
您可以覆盖基本组件上的add
方法,并将字体应用于添加的组件及其子组件。这将节省您在以后添加组件时手动应用字体的时间。我只想更改面板及其所有元素的字体。我不想更改其他面板的字体。使用UIManager进行此操作会更改所有Swing组件的字体。啊,这一点很好。我没有意识到您真正需要的是什么。现在我理解了您的问题,不确定如何(或是否可能)解决它。一个“备份”解决方案是像现在这样做,但也要通过标题边界的getBorder
和instanceof TitledBorder
/TitledBorder来检查和更新边框。setTitleFont
etcIt不会对面板内的所有元素都起作用。例如:具有带有标签的JPanel的JPanel可能不适用于边框,但您可以你可以在“添加”实现中调用任何你喜欢的代码,因此你没有理由不能调用你问题中的代码。基本上,我不认为有一个简单的答案。这是一个“不整洁”的操作。