如何在绘画中使用graphics2D或者有更好的方法吗?

时间:2012-04-13 13:56:22

标签: java image applet graphics2d

我想使用graphics2D但我无法得到它来显示我的图形。有没有更好的方法可以让我使用repaint()?最终我想将图像设置为背景并能够在其上绘制,然后将帧的内容保存为图像。

import java.awt.image.*;
import javax.imageio.ImageIO;
import javax.swing.*;

import java.io.File;
import java.io.IOException;
import java.net.URL;

import javax.swing.JApplet;
import java.awt.*;

// assume that the drawing area is 150 by 150
public class test extends JApplet
{
  final int radius = 25;
  int width = 200, height = 200;

 BufferedImage img = new BufferedImage(
   width, height, BufferedImage.TYPE_INT_ARGB);

  public void paint (  )
  { 
    Graphics2D g = img.createGraphics();
    g.setColor( Color.orange );
    g.fillRect( 0, 0, 150, 150 );
    g.setColor( Color.black );

    g.drawOval( (150/2 - radius), (150/2 - radius), radius*2, radius*2 );
   }
}

1 个答案:

答案 0 :(得分:2)

好的,

  1. 你有public void paint( )这到底是怎么回事?你需要一个图形对象。 public void paint(Graphics g)类似于初始化applet时自动调用的默认方法。

  2. 当您需要使用默认的Graphics g对象并将其转换为如此Graphics2D g = img.createGraphics();

  3. 的Graphics2D对象时,您有Graphics2D g2d = (Graphics2D) g;
  4. 您应该搜索有关双缓冲的更多信息:)

  5. 无论如何......这段代码很有效,所以从中得到你想要的东西:)

    P.S注意我是如何实现Runnable的;如果您只想使用Graphics2D代码,则无需执行此操作。它只是使类成为一个线程,并用于游戏帧速率:)

    希望这会有所帮助。

    import java.applet.*;
    import java.awt.*;
    
    
    public class Test extends Applet implements Runnable{
    
    public boolean isRunning = false;
    public int radius = 25;
    
    
    public void start() {
        isRunning = true;
        new Thread(this).start();
    }
    
    public void stop() {
        isRunning = false;
    }
    
    public void paint(Graphics g) {
        //Create Graphics2D object, cast g as a Graphics2D
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.ORANGE);
        g2d.fillRect(0, 0, 150, 150);
    
        g2d.setColor(Color.BLACK);
        g2d.drawOval((150/2 - radius), (150/2 - radius), radius * 2, radius * 2);
    }
    
    public void run() {
    
        while (isRunning) {
            repaint();
            try {
                Thread.sleep(17);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    }