jlabel中的文本分层显示

efzxgjgh  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(325)

在一个更大的项目中,我需要在一个jlabel中显示一个单词,填充整个屏幕。我注意到,当使用大字体(362及以上)时,以大写字母“w”开头的单词会分层显示:
分层“什么?”362码:

普通“什么?”361码:

我测试了不同的起始字母和单词,似乎只有起始字母“w”引起了它。此外,我在windows10和linux上测试了它,并且在不同的屏幕分辨率下,只有字体大小在分层文本和普通文本之间的切换似乎有所改变。以下代码是产生“奇怪”行为的最小示例:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    JLabel label = new JLabel();
    label.setHorizontalAlignment(SwingConstants.CENTER);
    label.setVerticalAlignment(SwingConstants.CENTER);
    label.setText("What?");
    Font old = label.getFont();
    panel.add(label);
    frame.setContentPane(panel);
    frame.setVisible(true);

    //label.setFont(new Font(old.getFontName(), Font.BOLD, 361)); // normal (WIN10)
    label.setFont(new Font(old.getFontName(), Font.BOLD, 362)); // layered (WIN10)
}

有人能解释这种行为吗?还是仅仅是一个bug?
编辑:
我进一步试验,我找不到任何其他的字母造成这种情况和长度的字似乎并不重要(即使文本是缩写)。我检查了几种不同的字体(例如arial、caladea、Consoles、noto serif、segoe print等等),似乎都受到不同字体大小的影响。所有样式(普通、粗体和斜体)都会受到影响。如果我计算“w”的宽度(使用textlayout.getbounds()),看起来宽度<~340会导致正常显示,而宽度>~340会导致分层显示。重新上漆,重新验证,无效都没有改变什么。我用不同的屏幕分辨率在我所有的机器(win10,linuxmint)上测试了它(它只在激活了windows屏幕缩放的设备上正常工作)

noj0wjuj

noj0wjuj1#

你能试试下面的吗?
为相同或更大的大小设置不同的字体(windows的默认字体为tahoma)尝试使用较小字体的长单词在函数末尾的父面板上尝试不使用粗体call repain()和/或invalidate()
这些可能会让你知道是什么导致了这个问题

相关问题