0

我试图做我的计算机科学作业,但当我试图使用以下方法时我被困住了。

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

谁能解释并举例说明如何使用它们?

我试图这样做..

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;

4

3 回答 3

1

我和安德鲁一起做这个,我从来没有用过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);

        }

    }

}
于 2012-12-31T01:04:15.530 回答
0

对我来说已经很晚了,但我会快速尝试一下。Graphics(或 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)

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

于 2012-12-30T06:22:34.323 回答
0

如果尚未完成,您可以阅读 2D 图形和javadocs的 java 教程。

于 2012-12-30T05:52:16.857 回答