我和安德鲁一起做这个,我从来没有用过Graphics#create(int, int, int, int)
。不过我确实用过Graphics#create
。
基本上,create 方法将创建一个新的图形上下文,它是原始的副本。这允许您在不影响原件的情况下操作副本。如果您正在对无法(轻松)撤消的图形执行操作,这一点很重要。
将图形上下文简单“归零”到新位置。Swing 绘制过程对其绘制的每个组件执行此操作。基本上,在paint
调用之前,图形上下文被翻译到组件位置,这意味着组件内的所有绘制都是从 0x0 完成的
public class TestGraphics01 {
public static void main(String[] args) {
new TestGraphics01();
}
public TestGraphics01() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestGraphicsPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestGraphicsPane extends JPanel {
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
FontMetrics fm = g.getFontMetrics();
// This creates a "copy" the graphics context, it's translated
// to the x, y position within the current graphics context
// and has a width and height. If the width or height is outside
// the current graphics context, then it is truncated...
// It's kind of like clip, except what ever you do to this copy
// does not effect the graphics context it came from...
// This would be simular to setting the clipping region, just it
// won't effect the parent Graphics context it was copied from...
Graphics create = g.create(100, 100, 200, 200);
create.setColor(Color.GREEN);
create.fillRect(0, 0, 200, 200);
create.setColor(Color.YELLOW);
create.drawString("I'm inside...", 0, fm.getAscent());
create.dispose();
// But I remain uneffected...
g.drawString("I'm outside...", 0, fm.getAscent());
// I will effect every thing draw afterwards...
g.setColor(Color.RED);
int y = 50 - (fm.getHeight() / 2) + fm.getAscent();
g.translate(50, y);
g.drawString("I'm half way", 0, 0);
// You must reset the translation if you want to reuse the graphics OR
// you didn't create a copy...
g.translate(-50, -y);
y = 350 - (fm.getHeight() / 2) + fm.getAscent();
g.translate(300, y);
g.drawString("I'm half way", 0, 0);
// You must reset the translation if you want to reuse the graphics OR
// you didn't create a copy...
g.translate(-300, -y);
}
}
}