Meine Buchstaben, die ich mit Graphics2D auf dem JFrame aufschreibe, sind nach dem maximieren des Bildschirms seltsam verzerrt. Wie kann man das verhindern?
public void draw(Graphics2D g2d, int x, int y, int yOffset) {
indentSize = g2d.getFontMetrics().charWidth(' ')*5*indent;
this.x = x + indentSize;
this.y = y;
g2d.setFont(font);
this.height = g2d.getFontMetrics().getHeight();
g2d.setColor(color);
g2d.drawString("" + c, this.x, y + yOffset);
offset = g2d.getFontMetrics().charWidth(c);
}
Diese dubiose Funktion kümmert sich lediglich um die Position eines Zeichens und kann folglich, nichts mit dem "verzerren" zu tun haben.Das hier ist eine Funktion der Klasse Char, die ich nutze:
Wenn du das Format änderst z.B. 16/10 -> 4/3 wird das Bild dadurch verzerrt.Sonst könnte ich mir nichts vorstellen, dass die Verzerrung verursacht. Ich dachte, dass Graphics2Ds drawString mit dem Scalen des Bildschirms mitscaled. Wenn ich den Bildschirm sehr dünn mache, wird die Schrift auch zusammengedrückt (mit setResizable(true)).
Wie könnte man das verändern?Wenn du das Format änderst z.B. 16/10 -> 4/3 wird das Bild dadurch verzerrt.
Das betrifft im Code des TE nicht die Breite und Höhe sondern nur die Position x, y des ausgegebenen Zeichens.Und dein Font änderst du ja nur in der Höhe Y Richtung in Breite X nicht.
In den Anzeigeeinstellungen deines Systems.Wie könnte man das verändern?
public void draw(Graphics2D g2d) {
if(dbi == null) {
dbi = createImage(getWidth(), getHeight());
dbg = dbi.getGraphics();
}
Graphics2D dbg2d = (Graphics2D) dbg;
dbg2d.setRenderingHints(renderhints);
renderOffScreen(dbg2d);
g2d.drawImage(dbi, 0, 0, getWidth(), getHeight(), null);
}
draw((Graphics2D) this.getGraphics());
Welche Unterschiede macht das?Verstehe ich das richtig, du willst direkt auf ein JFrame malen? Das ist nicht der richtige Weg. Du solltest dem JFrame eine JComponent z.B. JPanel hinzufügen und dieses zum zeichnen verwenden.
JFrame frame = new JFrame();
frame.setSize(600, 400);
frame.setVisible(true);
Graphics2D graphics2D = (Graphics2D) frame.getGraphics();
SwingUtilities.invokeLater(() -> graphics2D.drawLine(0, 0, 600, 400));