java 绘图_java绘图

java绘图坐标体系

像素:计算机屏幕上显示的内容都是屏幕上的每一个像素组成。例如:计算机显示器的分辨率是800*600,表示计算机屏幕上的每一行由800个点组成,共有600行,整个计算机屏幕共有480000个像素。像素是一个密度单位,而厘米是长度单位,两者无法比较。

绘图的原理Part1

Component类提供了两个和绘图相关最重要的方法:

①:paint(Graphics g):绘制组件的外观

注意点:当组件第一次在屏幕显示的时候,程序会自动的调用paint()方法来绘制组件。

在以下情况会自动调用paint()方法:

一:窗口最小化,再最大化。

二:窗口的大小发生变化(注意是大小变化,而不是移动窗口)

三:repaint函数被调用

②:repaint():刷新组件的外观

注意点:起到动感的作用。

Graphics 类:

Graphics 可以理解就是画笔,为我们提供各种绘制图形的方法:

①:画直线      drawLine(int x1,int y1,int x2,int y2);

②:画矩形边框   drawRect(int x,int y,int width,int height);

③:画椭圆边框  drawOval(int x,int y,int width,int height);

④:填充矩形     fillRect(int x,int y,int width,int height);

⑤:填充椭圆     fillOval(int x,int y,int width,int height);

⑥:画图片        drawImage(Image img,int x,int y,.....);

⑦:画字符串   drawString(String str,int x,int y);

⑧:设置画笔的字体  setFont(Font font);

⑨:设置画笔的颜色  setColor(Color c);

举例如下:

/**

* java绘图原理

* 不能再JFrame上画图,但是可以在JPanel上画图

*/

package day0218;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Panel;

import java.awt.Toolkit;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class Demo18_1 extends JFrame {

MyPanel mp = null;

public  Demo18_1() {

mp=new MyPanel();

this.add(mp);

this.setSize(800, 800);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

public static void main(String[] args) {

Demo18_1 demo18_1=new Demo18_1();

}

}

// 定义一个MyPanel(是我自己的面板,是用于绘图和显示绘图的区域)

class MyPanel extends JPanel {

// 覆盖JPanel的paint方法

// Graphics是绘图的重要类,你可以把他理解成一只画笔(可以画各种各样的)

public void paint(Graphics g) {

// 调用父类函数完成初始化(这句话不能少,现在似乎可以不加,最好加上)

super.paint(g);

//  // 画一个圆

//  g.drawOval(20, 20, 40, 40);

//  //g.drawOval(70, 20, 40, 40);

//

//  //画出直线

//  g.drawLine(40, 40, 90, 90);

//

//  //画出矩形边框

//  g.drawRect(100, 100, 50, 30);

//画出填充矩形

//设置颜色,若每次颜色不一样,每次都要设置

//     g.setColor(Color.green);

//  g.fillRect(150, 150, 60, 80);

//  g.setColor(Color.yellow);

//  g.fillRect(250, 250, 60, 80);

//

//    //在面板上画出图片(要先准备张图片)

//    Image im=Toolkit.getDefaultToolkit().getImage(Panel.class.getResource("/33.jpg"));

//    //显示图片 this指的是这里的JPanel

//    g.drawImage(im, 90, 90, 356, 521, this);

//设置画笔的颜色

//    g.setColor(Color.PINK);

//    g.setFont(new Font("华文琥珀", Font.BOLD, 55));

//    //如何画字

//    g.drawString("林峰万岁", 100, 200);

}

}

java事件处理机制

采取的是“委派事件模型”,是指当事件发生(比如按了鼠标,按了键盘)的时候,产生事件的对象(即事件源),会把此信息传递给事件的监听者处理的一种方式,而这里所说的信息实际上就是java.awt.evebt事件类库里某个类所创建的对象,我们暂时称之为事件的对象。

小练习:点击不同的按钮,让面板的背景色发生相应的变化。

代码如下:

/**

* 讲解java中的事件处理机制

* 理解:一个事件可以被多个类监听的

*

* 一个类要实现监听的步骤

* 1.实现相应的接口(KeyListener、MouseListener、ActionListener、WindowListener)

* 2.把接口的处理方法根据需要重新编写(Override)

* 3.在事件源注册监听

* 4.时间传递是靠事件对象

*/

package day0218;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class Shijian extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;

// 定义

JPanel jp = null;

JButton jb1, jb2;

public Shijian() {

jp = new JPanel();

jb1 = new JButton("黑色");

jb2 = new JButton("红色");

this.add(jb1, BorderLayout.NORTH);

jp.setBackground(Color.gray);

this.add(jp);

this.add(jb2, BorderLayout.SOUTH);

Cat mycat = new Cat();

// 注册监听

jb1.addActionListener(this);

jb1.addActionListener(mycat);

// 指定action命令

jb1.setActionCommand("aa");

jb2.addActionListener(this);

jb2.setActionCommand("bb");

this.setSize(300, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

public static void main(String[] args) {

Shijian sj = new Shijian();

}

@Override

public void actionPerformed(ActionEvent e) {

// 判断是哪个按钮被点击

if (e.getActionCommand().equals("aa")) {

// System.out.println("点击了黑色");

jp.setBackground(Color.black);

} else if (e.getActionCommand().equals("bb")) {

// System.out.println("点击了红色");

jp.setBackground(Color.red);

}

}

}

// 若要让猫类监听,那么也要注册监听

class Cat implements ActionListener {

@Override

public void actionPerformed(ActionEvent arg0) {

// TODO Auto-generated method stub

if (arg0.getActionCommand().equals("aa")) {

System.out.println("猫猫也知道你按了黑色按钮");

} else if (arg0.getActionCommand().equals("bb")) {

System.out.println("猫猫也知道你按了红色按钮");

}

}

}

// class MyPanel extends JPanel {

//

// public void paint(Graphics g) {

// super.paint(g);

//

// }

//

// }

小练习:怎么让小球受到键盘的控制,上下左右移动。

代码如下:

/**

* 加深对事件处理机制的理解

* 通过上下左右键,来控制小球的位置

*

* 我自我感觉是谁实现了监听的,就是在注册监听中被监听的

*/

package day0218;

import java.awt.Graphics;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class Shijian2 extends JFrame  {

MyPanel mp=null;

public  Shijian2() {

mp=new MyPanel();

this.add(mp);

//加上监听(这次是让mp来监听,而sj2是被监听的,因为mp监听到了,才能移动位置)

this.addKeyListener(mp);

this.setTitle("小球移动");

this.setSize(400,400);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setVisible(true);

}

public static void main(String[] args) {

Shijian2 sj2=new Shijian2();

}

}

class MyPanel extends JPanel implements KeyListener{

int x=10;

int y=10;

public void paint(Graphics  g) {

super.paint(g);

//画一个点(小圆圈)

g.fillOval(x, y, 10, 10);

}

@Override

//keyTyped表示表示一个键被按下去,但是这个键有具体的值,而且被显示出来了

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

}

@Override

//keyPressed表示一个键被按下去,但是这个键没有具体的值

public void keyPressed(KeyEvent e) {

//System.out.println((e.getKeyChar())+"键被按下");

if (e.getKeyCode()==KeyEvent.VK_DOWN) {

//System.out.println("向下");

//如果想让小圆走的快点,可以写上y+10类似的,

y++;

}else if (e.getKeyCode()==KeyEvent.VK_UP) {

y--;

}else if (e.getKeyCode()==KeyEvent.VK_RIGHT) {

x++;

}else if (e.getKeyCode()==KeyEvent.VK_LEFT) {

x--;

}

//调用repaint函数,来重绘界面(放在if语句里面也可以,但是每个if语句里面都要写)

this.repaint();

}

@Override

//键被释放

public void keyReleased(KeyEvent e) {

// TODO Auto-generated method stub

}

}

几个重要的概念:事件源,事件,事件监听器

一、事件源

是一个产生(或触发)事件的对象,比如前面的JButton的一个对象jb1,当这个事件源对象的某些状态以某种方式发生变化时,就会产生某种类型的事件(一个事件源可能会生成多个不同类型的事件)。如果某个组件(对象)希望得到事件源产生的事件,就需要在这个事件源上注册。

二、事件

是承载事件源状态改变时的信息对象。或者说,事件是事件源向事件监听器传输事件源状态信息的载体。在用户与GUI组件进行交互时就会生成事件,比如当鼠标在面板中移动,就会生成一个鼠标移动事件的对象,而这个对象保存着当前鼠标在面板中的位置信息。

注:java.awt.event包和javax.swing.event包中定义了各种事件类型,常见的事件类有:

420504931695da3932da3af2fc714249.png

三、事件监听器接口

事件监听者实际上就是一个类,该类实现了某个事件监听器接口。比如前面案例中的MyPanel是一个类,它实现了ActionListener接口,那它就可以作为一个事件监听者,对接受到的事件进行处理。

事件监听器接口有多种,不同的事件监听器接口可以监听不同的事件,一个类可以实现一个事件监听接口,也可以实现多个监听接口。

注:java.awt.event包和javax.swing.event包中定义了这些接口,常用的事件监听接口:

java事件处理机制

事件编程步骤:

①:编写事件处理类

②:根据需求给事件处理类实现监听器接口

③:在事件处理类中重写(实现)其事件处理的函数

④:在事件源类中指定该时间的监听器(响应者是谁),即注册监听

总结注意事项:

1.java采用委托机制处理事件

2.java中的事件是分类的,比如对窗体事件、鼠标事件、按键事件、操作事件[按按钮]

3.java中的一个类要监听某个事件,则必须实现相应的事件监听接口

4.事件监听接口有多种,程序员应当针对不同的情况,实现不同的监听接口,比如监听鼠标事件就应当实现MouseListener;要监听键盘事件,就应当实现KeyListener...

5.在实现监听接口的类(事件监听者/类)中,需要重写处理函数,比如实现了ActionListener接口,就应该重写actionPerformed(ActionEvent e),可以参考前面的事件监听器接口表格。

6.在事件源中需要注册事件听听类,否则事件监听类接收不到事件源发生的事件。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值