1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| package test;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
public final class Main2 {
public static void main(String... args) {
SwingUtilities.invokeLater(Main2::startAtEDT);
}
private static final void startAtEDT() {
final var infoLabel = new JLabel();
infoLabel.setText(String.format("Scale: x%.3f", 1.0));
final var drawBoard = new JComponent() {
private final double MAX_ZOOM = 16;
private final double MIN_ZOOM = 0.125;
private double scaleX = 1;
private double scaleY = 1;
private AffineTransform transform = AffineTransform.getScaleInstance(scaleX, scaleY);
{
addMouseWheelListener(event -> {
final double factor = (event.getWheelRotation() < 0) ? 2 : 0.5;
double scale = scaleX * factor;
scale = Math.max(MIN_ZOOM, scale);
scale = Math.min(MAX_ZOOM, scale);
scaleX = scale;
scaleY = scale;
transform = AffineTransform.getScaleInstance(scaleX, scaleY);
infoLabel.setText(String.format("Scale: x%.3f", scale));
repaint();
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
final var gr = (Graphics2D) g.create();
gr.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
gr.setColor(Color.WHITE);
gr.setTransform(transform);
final int surfaceX = (int) Math.ceil(getWidth() * 1 / scaleX);
final int surfaceY = (int) Math.ceil(getHeight() * 1 / scaleY);
gr.fillRect(0, 0, surfaceX, surfaceY);
// Debug.
gr.setColor(Color.GREEN);
gr.setStroke(new BasicStroke((float) (1 / scaleX)));
gr.drawRect(0, 0, surfaceX, surfaceY);
//
gr.setColor(Color.red);
gr.fillOval(1, 2, 10, 10);
gr.fillOval(10, 11, 10, 10);
//
gr.dispose();
}
};
final var root = new JPanel();
root.setLayout(new BorderLayout());
root.add(drawBoard, BorderLayout.CENTER);
root.add(infoLabel, BorderLayout.SOUTH);
final var frame = new JFrame("Test");
frame.setContentPane(root);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 500);
frame.setVisible(true);
}
} |
Partager