【问题标题】:JavaFX Windows Design differs on LinuxJavaFX Windows 设计在 Linux 上有所不同
【发布时间】:2018-08-07 18:29:18
【问题描述】:

我在 Windows 上构建了以下 JavaFX 应用程序。 在 Linux 上,按钮大小和字体大小不匹配。 标签、文本字段和按钮描述不适合其尺寸。

如何设置程序的字体大小,使其看起来像在 windows 下?

手动更改字体大小和字体样式效果不佳,因为它不适合尺寸。或者我没有找到合适的组合。

提前致谢

使用 JDK 8 的 Windows 和 Linux。
- JavaFX 工具:Gluon 的 SceneBuilder

以下没有帮助:
Default font size of JavaFX under Linux is larger as on Windows
Modena – new theme for JavaFX 8

【问题讨论】:

  • 您可能需要检查自己的 Linux 桌面环境设置。例如,大多数 Linux DE 都有自己的字体大小设置。这些可以覆盖您在 JavaFX 中编写的任何代码。
  • 感谢您的回答。我正在使用 Lubuntu。可悲的是,我看不到任何改变字体大小的环境设置。链接二显示,在 Ubuntu 上,字体大小与 Windows 不同。我不知道为什么 Java 这样做是没有意义的。
  • 应用程序的显示方式很大程度上取决于操作系统。我仍然相信 Xfce (我相信 Lubuntu 仍在使用它?)及其窗口管理器会发生一些事情。如果您无法弄清楚这一点,我建议作为一种解决方法的一件事是为您的容器设置minWidth 属性以匹配prefWidth 值。这样,容器将始终展开以完整显示其子项。
  • 查看 Google 以了解如何确认 Lubuntu 中的 DPI 设置。如果超过 100%,视觉元素在 Linux 中都会被放大;这与 Java 无关(您可以通过增加 DPI 值在 Windows 中看到相同的效果)。
  • 1) ~/.Xresources Xft.dpi: 96 2) gsettings set org.gnome.desktop.interface scaling-factor 1 3) gsettings set org.gnome.desktop.interface text-scaling-factor 1.0 4) gsettings set com.ubuntu.user-interface scale-factor "{'HDMI1': 8, 'eDP1': 8}" 都没有帮助。第一个适用于许多应用程序,但不适用于 JavaFX。有些人认为它会在 Java 9 中得到修复。

标签: java javafx


【解决方案1】:

[编辑:我突然想到我在对主题有很多认识之前就想出了这个“解决方案”。下次我处理这个问题时,我将检查在 Windows 和 Mac/Linux 上显式地使主题相同(而不是允许它们各自的默认值)是否消除了这个问题。]

我很失望地发现著名的“一次编写——到处运行”程序有这个相当大的缺陷。我希望有一种更优雅的方式来处理它,或者我遗漏或误解的东西,但现在我正在为给定的操作系统指定大小。据我所知,只有两种操作系统的缩放大小需要适应:一方面是 Windows,另一方面是 Linux/Mac。

如果只有一两个尺寸需要调整,可以使用以下方法:

    String os = System.getProperty("os.name","generic").toLowerCase(Locale.US);
    if (os.indexOf("mac") > 0) {
        root.setStyle("-fx-font-size: 14pt");           
    }

在这种情况下,Windows 默认字体的大小为 10pt,而我的 Mac 用户想要更大的字体,而该程序并没有被广泛分发。一旦在场景图的基础上为组设置了样式(我通常将其命名为“根”),它将与整个图相关,除非被覆盖。

但对于更复杂的情况,我使用了类似以下静态类的东西。当我分发应用程序时,通常作为自包含程序(使用 JLINK),操作系统是已知的,可以在文件顶部设置。我还不如只发布整个班级。您可能会有不同的细节,或多或少需要调整的东西。

如果有更好的方法来处理这个问题,我会全力以赴。

import java.awt.Font;
import java.awt.Insets;

/**
 * This file contains values needed that pertain to the
 * difference in the size relationships of fonts:pixels in
 * Mac OS and Windows. 
 * 
 * @author Phil Freihofner
 */
public class OSConstants {

    public enum OS {WIN, MAC_LINUX};
    public static OS os;
    {
//      os = OS.WIN;
        os = OS.MAC_LINUX;
    }
    
    public static Font tinySizeFont;
    public static Font smallSizeFont;
    public static Font normalSizeFont;
    public static Font largeSizeFont;
    public static Font bigLabelFont;
    public static Font cboChoicesFont;
    public static Font buttonFont;
    public static int preferenceButtonSpacer;
        
    public static Insets gridButtonInsets;
    public static Insets gridCBOInsets;
    public static Insets gridLabelInsets;
    public static Insets gridRadioInsets;
    public static Insets gridSliderInsets;
    
    private final int MAC_TINY_FONT_SIZE = 7;
    private final int MAC_SMALL_FONT_SIZE = 8;
    private final int MAC_CBO_FONT_SIZE = 10;
    private final int MAC_NORMAL_FONT_SIZE = 11;
    private final int MAC_LARGE_FONT_SIZE = 15;
    private final int MAC_BIG_LABEL_FONT_SIZE = 20;
    private final int MAC_PREFERENCE_BUTTON_SPACER = -16;

    private final Insets MAC_GRID_BUTTON_INSETS = new Insets(-1, -1, -1, -1);
    private final Insets MAC_GRID_CBO_INSETS = new Insets(-1, -1, -1, -2);
    private final Insets MAC_GRID_LABEL_INSETS = new Insets(-1, -1, -1, -1);
    private final Insets MAC_GRID_RADIO_INSETS = new Insets(-1, -1, -1, -1);
    private final Insets MAC_GRID_SLIDER_INSETS = new Insets(-1, -1, -1, -1);
    
    private final int WIN_TINY_FONT_SIZE = 8;
    private final int WIN_SMALL_FONT_SIZE = 9;
    private final int WIN_CBO_FONT_SIZE = 11;
    private final int WIN_NORMAL_FONT_SIZE = 12;
    private final int WIN_LARGE_FONT_SIZE = 16;
    private final int WIN_BIG_LABEL_FONT_SIZE = 24;
    private final int WIN_PREFERENCE_BUTTON_SPACER = -22;
    
    private final Insets WIN_GRID_BUTTON_INSETS = new Insets(2, 2, 2, 2);
    private final Insets WIN_GRID_CBO_INSETS = new Insets(2, 2, 2, 2);
    private final Insets WIN_GRID_LABEL_INSETS = new Insets(2, 2, 2, 2);
    private final Insets WIN_GRID_RADIO_INSETS = new Insets(2, 10, 2, 2);
    private final Insets WIN_GRID_SLIDER_INSETS = new Insets(2, 2, 2, 2);
    
    OSConstants()
    {
        if (os == OS.WIN)
        {
            tinySizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, WIN_TINY_FONT_SIZE);
            smallSizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, WIN_SMALL_FONT_SIZE);
            normalSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_NORMAL_FONT_SIZE);
            largeSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_LARGE_FONT_SIZE);
            bigLabelFont = new Font(Font.SERIF, Font.BOLD, WIN_BIG_LABEL_FONT_SIZE);
            cboChoicesFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_CBO_FONT_SIZE);
            buttonFont = new Font(Font.SANS_SERIF, Font.BOLD, WIN_NORMAL_FONT_SIZE);
            preferenceButtonSpacer = WIN_PREFERENCE_BUTTON_SPACER;
            
            gridButtonInsets = WIN_GRID_BUTTON_INSETS;          
            gridCBOInsets = WIN_GRID_CBO_INSETS;
            gridLabelInsets = WIN_GRID_LABEL_INSETS;
            gridRadioInsets = WIN_GRID_RADIO_INSETS;
            gridSliderInsets = WIN_GRID_SLIDER_INSETS;
        }
        else if (os == OS.MAC_LINUX)
        {
            tinySizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, MAC_TINY_FONT_SIZE);
            smallSizeFont = new Font(Font.SANS_SERIF, Font.PLAIN, MAC_SMALL_FONT_SIZE);
            normalSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_NORMAL_FONT_SIZE);
            largeSizeFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_LARGE_FONT_SIZE);
            bigLabelFont = new Font(Font.SERIF, Font.BOLD, MAC_BIG_LABEL_FONT_SIZE);
            cboChoicesFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_CBO_FONT_SIZE);
            buttonFont = new Font(Font.SANS_SERIF, Font.BOLD, MAC_NORMAL_FONT_SIZE);
            preferenceButtonSpacer = MAC_PREFERENCE_BUTTON_SPACER;
            
            gridButtonInsets = MAC_GRID_BUTTON_INSETS;          
            gridCBOInsets = MAC_GRID_CBO_INSETS;
            gridLabelInsets = MAC_GRID_LABEL_INSETS;
            gridRadioInsets = MAC_GRID_RADIO_INSETS;
            gridSliderInsets = MAC_GRID_SLIDER_INSETS;
        }    
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2020-04-02
    • 2015-10-05
    • 2011-08-09
    • 2018-07-06
    相关资源
    最近更新 更多