【问题标题】:Changed appearance of Swing TitledBorder since Java 9自 Java 9 以来更改了 Swing TitledBorder 的外观
【发布时间】:2021-10-02 13:37:51
【问题描述】:

我注意到在具有原生外观的 Windows 上,Java 8(及更早版本)和 Java 9(及更高版本)之间的TitledBorder 外观有所不同。从 Java 9 开始,边框变暗并且没有圆角。尤其是嵌套TitledBorder,这看起来令人不安。有没有办法使用 Java 9 并像 Java 8 一样绘制边框?

MWE:

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;

public class TitledBorderWithJava9 {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                //...
            }
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setSize(150, 100);
            JPanel panel = new JPanel();
            frame.add(panel);
            
            TitledBorder border = BorderFactory.createTitledBorder("Title");
            panel.setBorder(border);
            
            frame.setVisible(true); 
        });
    }
}

【问题讨论】:

  • 由于外观是一个类,您可以获取 Java 8 并复制它。这可能有效,如果无效,您可以尝试通过 UIManager.pu("property", "value") 更改 UI 属性,如果 java 版本大于 8。
  • 你可以指定你想要的任何基本边框createTitledBorder​ 以获得你想要的外观(我不会讨论品味)。实际的问题是,当实际 Window 的外观使用单色线边框时,为什么系统外观使用(软)斜角边框。
  • 感谢两位提供帮助的 cmets! @Frédéric Perron:不幸的是,这并不像看起来那么简单,因为该类引用了许多不是公共 API 的相关类,这会导致进一步的问题。 @Holger:我尝试了这种方法并接近了预期的结果,请参阅下面的答案。

标签: java swing java-9 titled-border


【解决方案1】:

根据问题的 cmets,以下方法接近预期结果(颜色和尺寸是正确的,但我没有设法像在 Java 8 中那样拥有圆角)。

Border baseBorderOuter = BorderFactory.createLineBorder(new Color(213, 223, 229), 1, true);
Border baseBorderInner = BorderFactory.createLineBorder(Color.WHITE, 1, true);
Border baseBorder = BorderFactory.createCompoundBorder(baseBorderOuter, baseBorderInner);

TitledBorder border = BorderFactory.createTitledBorder(baseBorder, "Title");
panel.setBorder(border);

【讨论】:

  • 你试过BorderFactory.createLoweredSoftBevelBorder()吗?还有一个版本允许显式设置颜色……
  • 是的,我试过了,还有 4 个颜色参数的方法和蚀刻的边框。但是,如果您查看确切的像素,它仍然不相等。一个问题是圆角的半径,另一个是斜角边框有内色和外色,但是在WindowsLookAndFeel,在底部边框上,内外颜色是相反的(即外颜色在里面在底部,而在左/上/右外侧)。
猜你喜欢
  • 2016-04-20
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2011-02-05
相关资源
最近更新 更多