有很多关于 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);
}
}
}
就是第一张截图背景的大图!!!如何修复代码?
非常非常感谢@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);
}
}
}