且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

图形 - 我如何使用的方法创建(INT X,INT Y,INT宽度,高度INT)和翻译(INT X,int y)对?

更新时间:2022-11-15 09:15:34

我和安德鲁我在这一个,我从来没有使用图形#创建(INT,INT,INT,INT)。我使用图形#创建虽然。

I'm with Andrew on this one, I've never used Graphics#create(int, int, int, int). I do use Graphics#create though.

基本上,创建方法将创建一个新的图形上下文,它是原始的副本。这使您可以与出影响原有操作的副本。这一点很重要,如果你的显卡是不能(容易)撤消执行操作。

Basically, the create method will create a new graphics context which is a copy of the original. This allows you to manipulate the copy with out effecting the original. This is important if you are performing operations on the graphics that can't be (easily) undone.

翻译简单的0的图形上下文到新的位置。 Swing的绘画过程中做到这一点为它绘制的每个组件。基本上,前油漆被调用时,图形上下文转换为元件的位置,这意味着该组件中的所有绘画是从为0x0完成

Translate simple "zeros" the graphics context to the new location. The Swing painting process does this for each component it paints. Basically, before paint is called, the graphics context is translated to the components position, meaning that all painting within the component is done from 0x0

图形 - 我如何使用的方法创建(INT X,INT Y,INT宽度,高度INT)和翻译(INT X,int y)对?

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);

        }

    }

}