图形 - 如何使用该方法创建(INT X,INT Y,INT宽度,高度INT)和翻译(INT X,i

2019-08-05 02:09发布

我试图做我的计算机科学功课,但我坚持,因为我尝试使用下面的方法。

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

    创建一个新的Graphics对象基于此Graphics对象,但是使用新的转换和剪贴区域。

    参数:

    • X - x坐标。
    • Ÿ - y坐标。
    • 宽度 - 剪切矩形的宽度。
    • 高度 - 剪贴矩形的高度。
  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

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

Answer 1:

我和安德鲁我就这一个,我从来没有使用Graphics#create(int, int, int, int) 我使用Graphics#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);

        }

    }

}


Answer 2:

你可以通过java的教程2D图形和javadoc文档如果尚未完成。



Answer 3:

已经晚了我,但我给它一个快速射击。 图形(或Graphics2D的)实例是一个图形设备(例如打印机,屏幕等)的抽象它有一个界限。 让你想画成只有设备的特定区域,你想要的代码永远是相对于(0,0)说,(如游戏,整个屏幕上的精灵移动)。 精灵将永远是相同的,但它的位置会有所不同。 实现这一目标的方法之一是创建限制输出到主的Graphics2D的一个子集一个Graphics2D。 那是什么

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

会为你做。 我认为的Graphics2D的其他属性是独立的为好。 这意味着设置在第二Graphics2D的油漆会不会影响主之一。

public abstract void translate(int x,int y)

是所有关于移动渊源考(但不是轴的方向)。 默认情况下,原点将是设备的左上角。 这是可以改变的是设备内的任何地方。 使用精灵在屏幕上移动的上述例子只是调用翻译你想要它绘制,然后绘制它。



文章来源: Graphics - How do I use the method create(int x, int y, int width, int height) and translate(int x, int y)?