为何JButton调用deriveFont(float size)无法修改字体大小?
为什么Java Swing中
deriveFont(float size)单参数方法没生效? 这个问题其实是Java方法重载的参数匹配规则在搞鬼,我来给你掰扯清楚~
首先得搞明白Font类里deriveFont的几个重载方法:
public Font deriveFont(int style):这个方法是用来修改字体样式的(比如粗体、斜体),参数是int类型的样式常量,比如Font.BOLD、Font.ITALIC,或者它们的组合(比如Font.BOLD | Font.ITALIC)。public Font deriveFont(float size):这个才是专门用来修改字体大小的方法,参数是float类型的字号。public Font deriveFont(int style, float size):同时修改字体样式和大小的重载方法。
现在看你的代码:
prevButton.setFont(prevButton.getFont().deriveFont(90));
这里你传入的90是int类型的字面量。Java编译器在匹配重载方法时,会优先选择参数类型完全匹配的那个——也就是deriveFont(int style),而不是需要把int自动转换为float的deriveFont(float size)。
那把90当成样式参数会发生什么?Font的样式是用位掩码定义的,合法的样式值只有Font.PLAIN(0)、Font.BOLD(1)、Font.ITALIC(2)这几个基础值,以及它们的组合。90这个值完全不在合法范围内,Java会把它默认处理成Font.PLAIN(普通样式),所以最终的字体还是原来的大小,样式也变回了普通,看起来就像“没改变大小”。
而当你调用:
prevButton.setFont(prevButton.getFont().deriveFont(Font.BOLD, 90));
这个是明确匹配双参数的重载方法,第一个参数是合法的样式常量,第二个参数虽然是int,但会自动转换为float作为字号,所以就能正确设置字体的样式和大小了。
如果就是想用单参数方法修改大小,也很简单——把参数改成float类型就行,比如:
prevButton.setFont(prevButton.getFont().deriveFont(90f));
这样编译器就会匹配到deriveFont(float size)这个重载,就能正常修改字号了。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

