图形 - 如何使用方法create(int x,int y,int width,int height)和translate(int x,int y)?

时间:2012-12-30 05:44:59

标签: java graphics awt translate java-2d

我正在尝试做我的计算机科学作业,但是因为我试图使用以下方法而陷入困境。

  1. public Graphics create(int x,int y,int width,int height)

    创建基于此Graphics对象的新Graphics对象,但具有新的翻译和剪辑区域。

    参数:

    • x - x坐标。
    • y - y坐标。
    • width - 剪切矩形的宽度。
    • height - 剪裁矩形的高度
  2. public abstract void translate(int x,int y)

    将图形上下文的原点转换为当前坐标系中的点(x,y)。

  3. 任何人都可以解释并举例说明如何使用它们吗?

    我试图这样做..

    public Graphics drawPlayer1()
    {
        myPencil.up();
        myPencil.move(-620,300);
        myPencil.down();
        myPencil.fillCircle(20);
        myPencil.up();
        myPencil.move(-590,300);
        myPencil.drawString("Player1: " + player1);
        p1.create(-620,300,40,40);
        return p1;
    }//end drawPlayer1
    

    当涉及到p1.create(-620,300,40,40)时,它给我一个nullPointerException;

3 个答案:

答案 0 :(得分:1)

我和安德鲁在这一次,我从未使用Graphics#create(int, int, int, int)。我确实使用了Graphics#create

基本上,create方法将创建一个新的图形上下文,它是原始的副本。这使您可以在不影响原件的情况下操纵副本。如果您对图形执行的操作无法(轻松)撤消,这一点非常重要。

将图形上下文的简单“零”翻译为新位置。 Swing绘画过程为它绘制的每个组件执行此操作。基本上,在调用paint之前,图形上下文被转换为组件位置,这意味着组件中的所有绘制都是从0x0

完成的。

enter image description here

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

        }

    }

}

答案 1 :(得分:0)

如果没有完成,您可以浏览the java tutorial for 2D graphicsjavadocs

答案 2 :(得分:0)

对我来说已经很晚了,但我会给它快速拍摄。图形(或Graphics2D)实例是图形设备的抽象(例如打印机,屏幕等)它具有边界。假设您想要仅绘制设备的特定区域,并且您希望代码始终相对于(0,0)(例如,精灵在屏幕上移动的游戏)。精灵将始终相同,但其位置将不同。实现此目的的一种方法是创建一个Graphics2D,将输出限制为主Graphics2D的子集。那就是

public Graphics create(int x,int y,int width,int height)

会为你做的。我认为Graphics2D的其他属性也是独立的。这意味着在第二个Graphics2D上设置Paint不会影响主要的。

public abstract void translate(int x,int y)

是关于移动orgin(但不是轴的方向)。默认情况下,原点将是设备的左上角。这可以更改为设备内的任何位置。使用上面的精灵在屏幕上移动的例子,只需在你想要绘制的地方调用translate,然后绘制它。