我试图做我的计算机科学功课,但我坚持,因为我尝试使用下面的方法。
public Graphics create(int x,int y,int width,int height)
创建一个新的Graphics对象基于此Graphics对象,但是使用新的转换和剪贴区域。
参数:
- X - x坐标。
- Ÿ - y坐标。
- 宽度 - 剪切矩形的宽度。
- 高度 - 剪贴矩形的高度。
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);
我和安德鲁我就这一个,我从来没有使用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);
}
}
}
你可以通过java的教程2D图形和javadoc文档如果尚未完成。
已经晚了我,但我给它一个快速射击。 图形(或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)?