Java 21 Swing Nimbus:在 Windows/Linux 高分辨率显示器上,GUI 很小

问题描述 投票:0回答:1

有很多关于 Java Windows/Linux 扩展主题的老问题没有明确的答案。 Swing 专家是否知道任何更新,例如 Nimbus 上的更新?

我在具有 1920x1080 像素屏幕的计算机上编写了一个非常好的 Swing 应用程序。今天我在高分辨率屏幕上看到了该应用程序,而且该应用程序很小。

我不知道如何解决这个问题。我用谷歌搜索了很多,但找不到好的答案。我发现的是 JEP 263 https://bugs.openjdk.org/browse/JDK-8055212 它说问题已解决。但不知道如何修复代码?

这是我使用的 Nimbus:

NimbusLookAndFeel nimbus = new NimbusLookAndFeel();
     UIManager.setLookAndFeel(nimbus);
     UIManager
           .put("control", Color.WHITE);
     UIManager.put("nimbusBlueGrey", ApplicationColors.getLightGrayGold());
     UIManager.put("nimbusBase", ApplicationColors.getDarkGold());
     UIManager.put("textForeground", Color.BLACK);
     UIManager.put("nimbusFocus", ApplicationColors.getSunflowerYellow());
     UIManager
           .put("ToolBar:Button.contentMargins", new Insets(5, 15, 5, 15));
     UIManager
           .put("TextField.background", ApplicationColors.getLightYellow());
     UIManager.put("ComboBox.forceOpaque", false);
     UIManager.put("TitledBorder.border", new Insets(10, 10, 10, 10));
     UIManager.put("TitledBorder.position", TitledBorder.ABOVE_BOTTOM);
     UIManager.put("TitledBorder.font", ApplicationFonts.getGermanFont(16F));
     UIManager.put("TitledBorder.titleColor", Color.GRAY);
     UIManager.put("Table.opaque", false);
     UIManager.put("List.opaque", false);
     UIManager.put("Table.cellRenderer", false);
     UIManager.put("OptionPane.buttonFont", ApplicationFonts.getGermanFont(16F));

     UIManager.put("OptionPane.cancelButtonText", translator.realisticTranslate(Translation.ABBRECHEN));
     UIManager.put("OptionPane.yesButtonText", translator.realisticTranslate(Translation.JA));
     UIManager.put("OptionPane.noButtonText", translator.realisticTranslate(Translation.NEIN));
     UIManager.put("OptionPane.titleText", translator.realisticTranslate(Translation.BILD_LOESCHEN));
     
     UIManager.put("FileChooser.openButtonText", translator.realisticTranslate(Translation.OEFFNEN));
     UIManager.put("FileChooser.cancelButtonText", translator.realisticTranslate(Translation.ABBRECHEN));
     UIManager.put("FileChooser.saveButtonText", translator.realisticTranslate(Translation.SPEICHERN));
     UIManager.put("FileChooser.cancelButtonToolTipText", translator.realisticTranslate(Translation.ABBRECHEN_DER_AUSWAHL));
     UIManager
           .put("FileChooser.saveButtonToolTipText",
                 translator.realisticTranslate(Translation.AUSGEWAEHLTE_DATEI_SPEICHERN));
     UIManager
           .put("FileChooser.openButtonToolTipText",
                 "Ausgewählte Datei öffnen");
     UIManager.put("FileChooser.upFolderToolTipText", "Eine Ebene höher");
     UIManager.put("FileChooser.homeFolderToolTipText", "Home");
     UIManager
           .put("FileChooser.newFolderToolTipText",
                 "Neuen Ordner erstellen");
     UIManager.put("FileChooser.listViewButtonToolTipText", "Liste");
     UIManager.put("FileChooser.detailsViewButtonToolTipText", "Details");
     UIManager.put("FileChooser.lookInLabelText", "Suchen in:");
     UIManager.put("FileChooser.fileNameLabelText", "Dateiname:");
     UIManager.put("FileChooser.filesOfTypeLabelText", "Dateityp:");
     UIManager
           .put("FileChooser.acceptAllFileFilterText",
                 "Alle Dateien (*.*)");
     UIManager.put("FileChooser.folderNameLabelText", "Ordnername:");
     UIManager.put("FileChooser.openDialogTitleText", translator.realisticTranslate(Translation.OEFFNEN));
     UIManager.put("FileChooser.saveDialogTitleText", translator.realisticTranslate(Translation.SPEICHERN));
     UIManager.put("OptionPane.background", ApplicationColors.getWhite());

如何在高 DPI Windows/Linux 屏幕上进行缩放?

更新

我在网上找到了这个:

每显示器 DPI 感知值的含义如下:

true - JRE-managed HiDPI
false - IDE-managed HiDPI

如果您需要使用比例 1.0 测试 IDE,有两个选项:

In JRE-managed HiDPI mode:
-Dsun.java2d.uiScale.enabled=true
-Dsun.java2d.uiScale=1.0

In IDE-managed HiDPI mode:
-Dsun.java2d.uiScale.enabled=false
-Dide.ui.scale=1.0

我会尽快测试并报告。

更新

最小的应用程序示例将包含太多代码,因为我使用自己的从 LayoutManager2 扩展的布局管理器。当然,我在 UI 上设置了尺寸。但它仍然应该扩展。

更新

如果你想查看缩放问题,可以从heise.de/download免费下载软件Cerebrummi 软件下载 Cerebrummi 软件需要 Java 21 jdk 才能运行。 如果您点击顶行的标志并选择英语,则可以将软件 Cerebrummi 设置为以英语显示。

更新

我遵循 Holgers 的建议,用我的大型软件的一些功能测试了一个小示例,并且它确实在高分辨率屏幕上进行了缩放。所以我必须在我的软件中找到它。

更新 我找到了有问题的代码:

public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      if (ApplicationImages.getImage() != null)
      {
         float factorWidth = getParent().getWidth() / 1280F;
         float factorHeight = getParent().getHeight() / 859F;
         if (factorWidth < factorHeight)
         {
            int width = (int) (1280F * factorHeight);
            int x = getParent().getWidth() / 2 - width / 2;
            g.drawImage(
              
ApplicationImages.getImage().getScaledInstance(width,
                    getParent().getHeight(), 
BufferedImage.SCALE_SMOOTH),
              x, 0, this);
         }
         else
         {
            int height = (int) (859F * factorWidth);
            int y = getParent().getHeight() / 2 - height / 2;
        
g.drawImage(ApplicationImages.getImage().getScaledInstance(
              getParent().getWidth(), height, 
BufferedImage.SCALE_SMOOTH),
              0, y, this);
        }
     }
  }

就是第一张截图背景的大图!!!如何修复代码?

software1

software2

software3dialog

java swing scaling nimbus highdpi
1个回答
0
投票

非常非常感谢@Holger。

现在我了解到: 不要设置系统缩放选项!!!

有问题的代码可以通过以下方式修复:

public void paintComponent(Graphics g)
   {
      super.paintComponent(g);
      if (ApplicationImages.getImage() != null)
      {
         float factorWidth = 1536 / 1280F; // here is the fix
         float factorHeight = 960 / 859F; // here is the fix
         if (factorWidth < factorHeight)
         {
            int width = (int) (1280F * factorHeight);
            int x = getParent().getWidth() / 2 - width / 2;
            g.drawImage(
                  ApplicationImages.getImage().getScaledInstance(width,
                    getParent().getHeight(), BufferedImage.SCALE_SMOOTH),
              x, 0, this);
         }
         else
         {
            int height = (int) (859F * factorWidth);
            int y = getParent().getHeight() / 2 - height / 2;
            g.drawImage(ApplicationImages.getImage().getScaledInstance(
              getParent().getWidth(), height, BufferedImage.SCALE_SMOOTH),
              0, y, this);
         }
      }
   }
© www.soinside.com 2019 - 2024. All rights reserved.