关于JAVA创建Graphics的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于JAVA创建Graphics的问题相关的知识,希望对你有一定的参考价值。

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class 事实上 extends JFrame
public static void main (String args[])

JFrame a = new JFrame ();
a.setVisible(true);
a.setSize(500, 500);
Graphics s = a.getGraphics();
a.paint(s);


public void paint (Graphics g)

super.paint(g);
g.drawLine(100, 100,200,200);
g.setColor(Color.BLACK);


想问下到底怎么才能绘画啊。。。我在做一个小游戏,结果卡在这个地方了,于是就写了这么一个小程序来 看,结果还是不行。。请高手指教到底哪里出问题了 。。。比如我想画一个 字符上去

你的Java程序我帮你改好了,你看看吧.(改动的地方见注释)

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
public class 事实上 extends JFrame
 public static void main (String args[])
 
  事实上  a= new 事实上 ();//JFrame a=new JFrame();改成 事实上  a= new 事实上 ();
  a.setVisible(true);
  a.setSize(500, 500);
  //Graphics s = a.getGraphics();//去掉这句
  //a.paint(s); //去掉这句
 
 public void paint (Graphics g)
 
  super.paint(g);
  g.setColor(Color.BLACK);//这句移到划线语句前面,先设置画笔颜色
  g.drawLine(100, 100,200,200);
 

运行结果

追问

为什么不需要获得画笔 还有就是 比如我想用 drawline drawchars 等一系列方法 难道都要像这个一样 自己重写吗? 系统不是写好了这些函数么 该怎么调用呢?

追答

不需要获得画笔,系统会自动调用public void paint (Graphics g)函数,
你把drawline,drawChars等函数都写在public void paint (Graphics g)函数中,就行了,就象例子中那样.

追问

我需要写出具体的函数内容还是说只要把名字 写到 paint中就行了? 我是小白 谢谢您帮我
还有就是 比如我需要在另外一个类调用画图 那我要在 另外一个类 申请一个 这个类的变量a,然后调用这个类的 a.paint 可是括号里面的参数哪里来呢?

追答

你只需要调用象drawline,drawChars等函数,并且把函数要求的参数填满,就可以了,我给你个drawLine和drawChars的例子,你看看吧.

public void paint (Graphics g)
 
  super.paint(g);
  g.setColor(Color.BLACK);//这句移到划线语句前面,先设置画笔颜色
  g.drawLine(100, 100,200,200);
  String s="abc";
  g.drawChars(s.toCharArray(), 0, s.length(),200,200);
 

运行结果

追问

可是你比如 我想用一个循环来不停的更改画画的位置。那你既然在PAINT里面设置了固定的数值,那怎么循环呢?

追答

给你一个用循环划线的程序的paint函数部分.

int size=5;
 int gridLen=30;
 public void paint (Graphics g)
 
  super.paint(g);
  g.setColor(Color.BLACK);
  for(int i=0;i<=size;i++) 
   g.drawLine(40+i*gridLen, 40, 40+i*gridLen, 40+size*gridLen); 
   g.drawLine(40, 40+i*gridLen, 40+size*gridLen, 40+i*gridLen); 
   
  String s="abc";
  g.drawChars(s.toCharArray(), 0, s.length(),200,200);
 

运行结果

参考技术A JFrame a = new JFrame (); // 改成JFrame _frame = new 事实上();
嗯.. 中文名真别扭

JAVA Graphics类中drawImage方法怎么用

drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)

最后一个参数是填什么东西,不懂,API文档写的不清楚

1、先在eclipse中创建一个java工程文件,命名为UseFunction。

2、然后在src下创建demo包,在demo下创建MyClass类。

3、接着在MyClass类中创建一个函数。函数内容很简单,只是输出一条语句。

4、接着就是要在main函数中调用上一步创建的函数。

5、编辑好MyClass.java文件后,通过java应用程序的方式运行MyClass.java。

6、运行后,可以在控制台中看到输出了一条语句,说明成功调用了函数。

参考技术A

  Graphics有六个drawImage方法,我们用的最多的是  public abstract boolean drawImage(Image img, int x, int y,int width, int height,ImageObserver observer);

  img是要加载的图像,x,y是指定绘制图像矩形左上角的位置,width是指定绘制图像矩形的宽,width是指定绘制图像矩形的高,observer是要绘制图像的容器。

  因为Graphics是一个抽象类,所以我们一般是重写其它容器的paint方法,例如JPanel或者JFrame等。下面是一个具体的例子:

package konw.win;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
class MyGraphics extends JPanel

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    public void paint(Graphics g)
    
        Toolkit tool = this.getToolkit();
        Image image = tool.getImage("image.jpg");
        g.drawImage(image, 10, 10, image.getWidth(this),image.getHeight(this), this);
    

public class WinDrawImageTest

    public static void main(String[] args)
    
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.add(new MyGraphics());
        
        frame.setVisible(true);
    

参考技术B 最后一个添null就可以了,那是用来检测图片改变的“图片观察者”,实际中基本用不到。因为这个观察者类在java设计中有严重缺陷,会导致图片绘制不及时,所以图片更新的工作往往都是由开发者自己来做。本回答被提问者采纳 参考技术C drawImage你知道是画图了。准确地说,这个是异步画图(就是说,不同步),执行了之后,画图了,但是以后可能会有新的部分需要画(动画图的第二帧或者第一次只画一半),那么,当新的部分被画的时候,很可能是在另一个线程里画的,不是你调用drawImage的这个线程。
那么,你很可能会想得到“有新部分被画了”这个事件。ImageObserver 就是这类事件的一种接收器。只要是实现了ImageObserver这个接口的Object传进去就行了。具体的ImageObserver的imageUpdate方法,你可以直接刷新它的容器(因为容器内的图刷新了嘛,所以需要刷新容器的样子吧)。如果你肯定图是稳定的(好像BufferedImage就是)能一次画完的,可以直接传入null,表示不给它ImageObserver,不监听“有新部分被画了”这个事件
参考技术D 一般都填this

以上是关于关于JAVA创建Graphics的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于在java中绘制多边形

关于android:getSlotFromBufferLocked的问题

使用Swing和Graphics2D在Java中旋转滚轮?

cocos creator3.x 关于Graphics组件绘制不显示的问题

这是惯用的Java吗?

如何在 java 中的 Graphics2D 对象上创建事件