Расширяя ответ @ littel , вы можете сравнить текущее преобразование с идентификатором при изменении размера кадра, используя приведенный ниже пример.Обратите внимание, что изменяются только компоненты переноса: dx = 75.0
составляет половину разницы между шириной MyCanvas
и Left
, в то время как dy
включает в себя вертикальное смещение Left
и размер зеленой границы.
Identity: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
Identity: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
Current: AffineTransform[[1.0, 0.0, 75.0], [0.0, 1.0, 201.0]]
Current: AffineTransform[[1.0, 0.0, 75.0], [0.0, 1.0, 1.0]]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.geom.AffineTransform;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainClass {
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLayout(new GridLayout(0, 1));
jf.add(new MyCanvas());
jf.add(new MyCanvas());
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
class MyCanvas extends JPanel {
MyCanvas() {
setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
setPreferredSize(new Dimension(600, 200));
setBorder(BorderFactory.createLineBorder(Color.red));
add(new Left(), BorderLayout.CENTER);
}
}
class Left extends JPanel {
Left() {
setPreferredSize(new Dimension(450, 100));
setBorder(BorderFactory.createLineBorder(Color.green));
setBackground(Color.gray);
System.out.println("Identity: " + new AffineTransform());
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
System.out.println("Current: " + g2.getTransform());
g2.drawRect(getWidth() / 2 - 10, getHeight() / 2 - 10, 20, 20);
}
}