在Swing应用程序中实时更改字体大小

4
现在很多网站都提供了一个选项,让用户可以增大或减小网站上的字体大小。我想在我的Java Swing应用程序中添加类似的功能,让用户可以通过菜单项在运行时将字体更改为较大或标准大小。
目前我的代码版本效果不太好——代码遍历存储在UIManager/UIDefaults中的键,对于每个字体键,我的代码派生出一个新的字体,其目标点大小(例如,如果是较大,则新的点大小通常为16;否则,如果恢复到标准大小,则通常为11),然后将该键和新字体放入UIManager中。之后,代码在框架上调用SwingUtilities.updateComponentTreeUI(),并打包框架。
代码会增加字体大小一次,但切换回标准大小没有效果。这在菜单栏中特别明显。
我这样做对吗?我应该创建一个具有更大点大小的新外观,还是使用其他方法?谢谢您提前的帮助。
1个回答

4

这段代码可以将字体放大一次,但是切换回常规大小没有效果。

我认为您需要使用FontUIResource更新UIManager,而不仅仅是一个Font。

编辑:

您应该可以使用以下代码:

SwingUtilities.updateComponentTreeUI(frame);

请查看 Swing 教程中有关启动后更改 LAF的部分;


哇,这真是令人印象深刻。你完全做到了。将我的代码更改为使用FontUIResource真的很奇妙。谢谢! - Mike
我想要做到同样的效果,即当用户将窗口移动到具有不同像素密度的不同显示器上时,字体大小会相应更新。我使用FontUIResource更新了UIManager键。现在所有新组件都使用更新后的字体大小创建。但是,在更新UIManager键之前如何更新已经创建的组件的字体大小呢? - Nehad
@Nehad。请查看编辑。 - camickr
@camickr,谢谢。到目前为止它已经起作用了,除了JMenuBar。我尝试将JMenuBar、JMenu和JDialog对象传递给SwingUtilities.updateComponentTreeUI(),但是菜单栏字体没有被更新/重绘。有任何想法为什么会跳过menubar吗? - Nehad
如果你更改了字体,你需要使用FontUIResource。这个“字体资源”将被LAF更改所取代。如果你只是使用一个字体,LAF会认为这是一个自定义字体,你想要保留它,并且不会在LAF更改时替换它。如果你还有其他问题,请发布一个新的问题并附上一个[mre]来说明问题。 - camickr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接