Graphics2d zoomen

Lasnik

Mitglied
Hey, ich habe ein Programm, in welchem ich in die Mitte der Gitternetzlinien zoomen will. Ich habe mir viel zu dem Thema angesehen und zuletzt versucht eine StackOverFlow Antwort einzubauen.
Aber egal was ich probiere, es wird immer in die falsche Richtung gezoomt. Wie kann ich also zentral auf das Grid, welches in einem JPanel in einem JFrame integriert ist zoomen?
In den Zeilen 21 - 26 und 72 - 77 ist eigentlich alles relevante
[CODE lang="java" title="Grid.java" highlight="21-26, 72-77"]import java.awt.*;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;

public class Grid {
static int width, height, size, camX, camY;
static double zoom = 1;
static ArrayList<Cell> cells;

public static void init(int width, int height, int size, ArrayList<Cell> cells) {
Grid.width = width;
Grid.height = height;
Grid.size = size;
Grid.cells = cells;
}

static AffineTransform at = new AffineTransform();

public static void render(Graphics2D g2) {
// zooming and panning
at.translate(
(width * size * (1 - zoom)) / 2,
(height * size * (1 - zoom)) / 2);
at.scale(zoom, zoom);
zoom = 1;
g2.setTransform(at);
g2.translate(camX, camY);

for (Cell cell : cells) {
g2.setColor(cell.color);
g2.fillRect(size * cell.x, size * cell.y, size, size);

// count overlapping cells
int times = 0;
for (Cell cellCounter : cells) {
if (cellCounter.x == cell.x && cellCounter.y == cell.y) {
times++;
}
}
if (times > 1) {
g2.setColor(Grid.getContrastColor(cell.color));
g2.setFont(new Font("TimesRoman", Font.PLAIN, size));
g2.drawString(times + "", size * cell.x, size * (cell.y + 1));
}
}

// render Grid
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
g2.setColor(Color.white);
g2.drawRect(size * i, size * j, size, size);
}
}

}


public static void move(Movement move) {
switch (move) {
case GRID_UP:
move(0, 1);
break;
case GRID_DOWN:
move(0, -1);
break;
case GRID_LEFT:
move(1, 0);
break;
case GRID_RIGHT:
move(-1, 0);
break;
case GRID_ZOOM_IN:
zoom = 1.1;
break;
case GRID_ZOOM_OUT:
zoom = 0.9;
break;
}
Main.getStatic.main.frame.repaint();
}

private static void move(int x, int y) {
camX += x * size;
camY += y * size;
}

private static Color getContrastColor(Color color) {
double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue()) / 1000;
return y >= 128 ? Color.black : Color.white;
}
}[/CODE]
 

mihe7

Top Contributor
Beispiel:

Java:
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class Zoom {

    class ZoomPanel extends JPanel {
        private double zoom = 1.0;

        public void setZoom(double zoom) {
            this.zoom = zoom;
            repaint();
        }

        public void paintComponent(Graphics g) {
            g.setColor(getBackground());
            g.fillRect(0, 0, getWidth(), getHeight());
            g.setColor(getForeground());

            Graphics2D g2 = (Graphics2D) g;
            Point2D cam = new Point.Double(400, 300);
            Point2D center = new Point.Double(400, 300); // Mitte der virtuellen "Welt" 
            // Alternativ die Mitte des Panels:
            // Point2D center = Point.Double(getWidth() / 2.0, getHeight() / 2.0); 

            AffineTransform at = new AffineTransform();
            
            at.translate(center.getX() - cam.getX(), center.getY() - cam.getY());
            at.translate(cam.getX() * (1 - zoom),
                         cam.getY() * (1 - zoom));
            at.scale(zoom, zoom);
            g2.setTransform(at);

            g2.fill(new Rectangle2D.Double(cam.getX() - 5, cam.getY() - 5, 10, 10));
            g2.draw(new Rectangle2D.Double(350, 250, 100, 100));
        }
    }


    public void run() {
        ZoomPanel panel = new ZoomPanel();
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(panel);
        frame.setSize(800, 600);
        frame.setVisible(true);

        Timer t = new Timer(500, e -> { 
            Timer timer = (Timer) e.getSource();
            panel.setZoom(panel.zoom + 0.1); 
            if (panel.zoom > 2) {
                timer.stop();
            }
        });
        t.start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Zoom().run());
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Was ist ein Shape, also klar ein Objekt, aber was ist damit gemeint (Graphics2d)? Und was sidn affinetransformationen AWT, Swing, JavaFX & SWT 1
L AWT graphics2d transform AWT, Swing, JavaFX & SWT 7
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
Soloeco Graphics2D - Verbinden zweier Punkte AWT, Swing, JavaFX & SWT 6
B Graphics -> Graphics2D etwas zu beachten? AWT, Swing, JavaFX & SWT 8
D AWT Graphics2D getClip gibt null zurück AWT, Swing, JavaFX & SWT 3
B Graphics2D Componente Drehen AWT, Swing, JavaFX & SWT 2
M Graphics2D: drawString Berechnung AWT, Swing, JavaFX & SWT 1
X AWT Graphics2D zum LWJGL Display hinzufügen aber wie? AWT, Swing, JavaFX & SWT 4
D Graphics2D einen Bereich füllen AWT, Swing, JavaFX & SWT 1
M JPanel und Graphics2D AWT, Swing, JavaFX & SWT 2
S Java2D/Graphics2D in Android..? AWT, Swing, JavaFX & SWT 2
B Graphics2d drawString mit double Werten? AWT, Swing, JavaFX & SWT 5
S Graphics2D: Transparent übereinander zeichnen AWT, Swing, JavaFX & SWT 7
S Graphics2D - setClip() AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Graphics2D object in ein anderes Zeichnen AWT, Swing, JavaFX & SWT 7
S AWT Pong - Probleme mit übergreifenden Objekten && Graphics2D AWT, Swing, JavaFX & SWT 3
C Image mit Graphics2D zeichnen AWT, Swing, JavaFX & SWT 9
S Frage zu Graphics2D AWT, Swing, JavaFX & SWT 3
Developer_X Swing Auf ein BufferedImage mit Graphics/Graphics2D zeichnen AWT, Swing, JavaFX & SWT 6
N AWT Graphics2D mehrmals aufrufen AWT, Swing, JavaFX & SWT 5
Developer_X Swing Graphics2D.zoom, wie rückgängig machen? AWT, Swing, JavaFX & SWT 6
Developer_X Swing Graphics2D translate zerstört performance AWT, Swing, JavaFX & SWT 2
N graphics2d auf panel AWT, Swing, JavaFX & SWT 2
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
0 AWT Graphics2D.drawImage() funktioniert nicht mehr korrekt mit Core i7 AWT, Swing, JavaFX & SWT 4
A Swing LAF unter Windows: javax.swing.DebugGraphics cannot be cast to java.awt.Graphics2D AWT, Swing, JavaFX & SWT 5
A Swing Mit Graphics2D auf transparentem Hintergrund zeichnen AWT, Swing, JavaFX & SWT 7
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
D BufferedImage und Graphics2D AWT, Swing, JavaFX & SWT 3
cowabunga1984 Implementierung von Graphics2D AWT, Swing, JavaFX & SWT 2
C Graphics2D, Text abschneiden AWT, Swing, JavaFX & SWT 2
N Graphics2D mit unterschiedlichen Grauwerten befüllen AWT, Swing, JavaFX & SWT 3
F Graphics2D scale und Positionierung einer TextArea AWT, Swing, JavaFX & SWT 8
F JPanel: Graphics2D, scale und Mauskoordinaten AWT, Swing, JavaFX & SWT 4
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
M Graphics2D - abstract void draw(.) AWT, Swing, JavaFX & SWT 2
redztripe Graphics2D rotieren und rotiertes Bild abspeichern AWT, Swing, JavaFX & SWT 2
R AffinrTransform + Graphics2D verschieben AWT, Swing, JavaFX & SWT 3
R Graphics2D + Bild anzeigen. AWT, Swing, JavaFX & SWT 25
M Probleme mit Graphics2D AWT, Swing, JavaFX & SWT 7
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
T JavaFX Nach Zoomen wird an falscher Stelle gezeichnet AWT, Swing, JavaFX & SWT 0
P Scrollbalken verschwinden beim Zoomen AWT, Swing, JavaFX & SWT 4
F Zoomen in JPanel AWT, Swing, JavaFX & SWT 3
J Diverse Grafiken in JPanel anzeigen und zoomen AWT, Swing, JavaFX & SWT 3
J zoomen in JPanel AWT, Swing, JavaFX & SWT 15
F 2D-Grafik Skalieren der Scrollbars beim Zoomen einer JScrollPane AWT, Swing, JavaFX & SWT 4
T 2D-Grafik Im 2D Spiel zoomen AWT, Swing, JavaFX & SWT 6
0 2D-Grafik 2D Bibliothek zum Zeichnen und Zoomen gesucht AWT, Swing, JavaFX & SWT 4
M Zoomen in ein JPanel... und eine andere kleine Frage AWT, Swing, JavaFX & SWT 3
bj99 Swing [Erledigt] Bild schrittweise zoomen AWT, Swing, JavaFX & SWT 4
C Performant mit MouseWheel zoomen AWT, Swing, JavaFX & SWT 2
G JScrollpage: Viewport beim Zoomen immer relative zentrieren AWT, Swing, JavaFX & SWT 5
F [Java 1.5] Shapes auf einem JPanel zoomen AWT, Swing, JavaFX & SWT 11
M auch JScrollPane aber mit Zoomen, wie wird der View gesetzt AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben