Ich habe eine wirklich schöne Swing-Anwendung auf einem Computer mit 1920x1080 Pixel-Bildschirm programmiert. Heute habe ich die Anwendung auf einem hochauflösenden Bildschirm gesehen und die App war winzig.
Ich weiß nicht, wie ich dieses Problem beheben kann. Ich habe viel gegoogelt, konnte aber keine gute Antwort finden. Was ich gefunden habe, ist JEP 263 https://bugs.openjdk.org/browse/JDK-8055212
Da steht, dass das Problem behoben ist. Aber nicht, wie man den Code repariert?
Dies ist der Nimbus, den ich verwende:
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());
Wie skaliere ich auf Windows-/Linux-Bildschirmen mit hoher DPI?
UPDATE
Das habe ich gefunden im Internet:
Der DPI-fähige Wert pro Monitor bedeutet Folgendes:
true - JRE-managed HiDPI
false - IDE-managed HiDPI
Wenn Sie die IDE mit Maßstab 1.0 testen müssen, gibt es zwei Möglichkeiten:
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
Ich werde dies testen und so schnell wie möglich berichten.
UPDATE
Das minimale App-Beispiel würde zu viel Code sein, da ich meine eigenen Layout-Manager verwende, die von LayoutManager2 erweitert wurden. Natürlich stelle ich die Größen auf der Benutzeroberfläche ein. Aber es sollte trotzdem skalieren.
UPDATE
Wenn Sie das Skalierungsproblem sehen möchten, können Sie die Software Cerebrummi kostenlos bei heise.de herunterladen /download
Software-Download
Die Software Cerebrummi benötigt zum Ausführen Java 21 JDK.
Die Software Cerebrummi kann so eingestellt werden, dass sie auf Englisch angezeigt wird, wenn Sie auf die Flagge in der oberen Zeile klicken und Englisch auswählen.
UPDATE
Ich habe Holgers Rat befolgt und ein kleines Beispiel mit einigen Funktionen meiner großen Software getestet, und es hat auf einem hochauflösenden Bildschirm skaliert. Es ist also etwas in meiner Software, das ich finden muss.
UPDATE
Ich habe den fehlerhaften Code gefunden:
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);
}
}
}
Es ist das große Bild im Hintergrund des ersten Screenshots!!! Wie kann ich den Code reparieren?


