Hallo zusammen,
ich habe ein für mich bisher nicht lösbares Problem, was die DPI-Skalierung von Java-Swing-Anwendungen betrifft.
Für unsere Anwendung verwenden wir ein selbst geschriebenes L&F und verwenden natürlich darin viel Java2D. Bisher lief die Anwendung immer unter Java 8. Java 8 skaliert noch nicht selbst, daher sieht die Anwendung auf skalierten Bildschirmen ein klein wenig verschwommen aus, aber ansonsten gibt es keine Darstellungsfehler. Seit Kurzem setzen wir Java 11 ein, was u a. die Darstellung der skalierten Anwendung deutlich verbessert, allerdings kamen damit auch neue Probleme hinzu. Die meisten konnten gelöst werden, allerdings bei einem weiß ich leider nicht mehr weiter. Im Netz konnte ich auch keine Lösungen dafür finden.
Problem ist, dass bei Verwendung von Java2D, z.B. drawRect, fillRect, drawLine, die Pixel-Positionen nicht mehr eindeutig zu sein scheinen.
Einfaches rudimentäres Beispiel:
Der Code malt ein 10x10 Pixel großes Rechteck mit Hilfe der drawLine-Methode. (Ich weiß, fillRect macht das einfacher, aber das verdeutlicht das Problem). Das sieht auf einem nicht-skalierten Bildschirm (100%) genauso aus.
Auf einem skalierten Bildschirm aber so:
125% Skalierung 150% Skalierung
Anderes Beispiel:
Ein Rechteck in Magenta wird von einem schwarzen Rahmen umrandet. Sieht unskaliert korrekter Weise so aus:
150% skaliert so:
Mit einer Bildschirmlupe sieht man, dass da etwas verschoben wird.
Mir ist schon klar, dass Java durch das Skalieren jetzt u.U. mehrere "echte" Pixel zusammenfassen muss, aber das müsste dann bei jeder Pixelposition gleich gemacht werden.
Falls jemand eine Lösung weiß, wäre ich für einen Tipp echt dankbar.
Viele Grüße
Tom
ich habe ein für mich bisher nicht lösbares Problem, was die DPI-Skalierung von Java-Swing-Anwendungen betrifft.
Für unsere Anwendung verwenden wir ein selbst geschriebenes L&F und verwenden natürlich darin viel Java2D. Bisher lief die Anwendung immer unter Java 8. Java 8 skaliert noch nicht selbst, daher sieht die Anwendung auf skalierten Bildschirmen ein klein wenig verschwommen aus, aber ansonsten gibt es keine Darstellungsfehler. Seit Kurzem setzen wir Java 11 ein, was u a. die Darstellung der skalierten Anwendung deutlich verbessert, allerdings kamen damit auch neue Probleme hinzu. Die meisten konnten gelöst werden, allerdings bei einem weiß ich leider nicht mehr weiter. Im Netz konnte ich auch keine Lösungen dafür finden.
Problem ist, dass bei Verwendung von Java2D, z.B. drawRect, fillRect, drawLine, die Pixel-Positionen nicht mehr eindeutig zu sein scheinen.
Einfaches rudimentäres Beispiel:
Java:
for (int y = 10; y < 20; y++) {
g.drawLine(10, y, 19, y);
}
Der Code malt ein 10x10 Pixel großes Rechteck mit Hilfe der drawLine-Methode. (Ich weiß, fillRect macht das einfacher, aber das verdeutlicht das Problem). Das sieht auf einem nicht-skalierten Bildschirm (100%) genauso aus.
Auf einem skalierten Bildschirm aber so:
125% Skalierung 150% Skalierung
Anderes Beispiel:
Java:
g.setColor(Color.MAGENTA);
g.fillRect(10, 10, 31, 31);
g.setColor(Color.BLACK);
g.drawRect(10, 10, 30, 30);
Ein Rechteck in Magenta wird von einem schwarzen Rahmen umrandet. Sieht unskaliert korrekter Weise so aus:
150% skaliert so:
Mit einer Bildschirmlupe sieht man, dass da etwas verschoben wird.
Mir ist schon klar, dass Java durch das Skalieren jetzt u.U. mehrere "echte" Pixel zusammenfassen muss, aber das müsste dann bei jeder Pixelposition gleich gemacht werden.
Falls jemand eine Lösung weiß, wäre ich für einen Tipp echt dankbar.
Viele Grüße
Tom