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包中定義了各種事件類型,常見的事件類有:
三、事件監聽器接口
事件監聽者實際上就是一個類,該類實現了某個事件監聽器接口。比如前面案例中的MyPanel是一個類,它實現了ActionListener接口,那它就可以作為一個事件監聽者,對接受到的事件進行處理。
事件監聽器接口有多種,不同的事件監聽器接口可以監聽不同的事件,一個類可以實現一個事件監聽接口,也可以實現多個監聽接口。
注:java.awt.event包和javax.swing.event包中定義了這些接口,常用的事件監聽接口:
java事件處理機制
事件編程步驟:
①:編寫事件處理類
②:根據需求給事件處理類實現監聽器接口
③:在事件處理類中重寫(實現)其事件處理的函數
④:在事件源類中指定該時間的監聽器(響應者是誰),即注冊監聽
總結注意事項:
1.java采用委托機制處理事件
2.java中的事件是分類的,比如對窗體事件、鼠標事件、按鍵事件、操作事件[按按鈕]
3.java中的一個類要監聽某個事件,則必須實現相應的事件監聽接口
4.事件監聽接口有多種,程序員應當針對不同的情況,實現不同的監聽接口,比如監聽鼠標事件就應當實現MouseListener;要監聽鍵盤事件,就應當實現KeyListener...
5.在實現監聽接口的類(事件監聽者/類)中,需要重寫處理函數,比如實現了ActionListener接口,就應該重寫actionPerformed(ActionEvent e),可以參考前面的事件監聽器接口表格。
6.在事件源中需要注冊事件聽聽類,否則事件監聽類接收不到事件源發生的事件。