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包中定義了各種事件類型,常見的事件類有:

 

三、事件監聽器接口

事件監聽者實際上就是一個類,該類實現了某個事件監聽器接口。比如前面案例中的MyPanel是一個類,它實現了ActionListener接口,那它就可以作為一個事件監聽者,對接受到的事件進行處理。

事件監聽器接口有多種,不同的事件監聽器接口可以監聽不同的事件,一個類可以實現一個事件監聽接口,也可以實現多個監聽接口。

注:java.awt.event包和javax.swing.event包中定義了這些接口,常用的事件監聽接口:

 

java事件處理機制
事件編程步驟:
①:編寫事件處理類
②:根據需求給事件處理類實現監聽器接口
③:在事件處理類中重寫(實現)其事件處理的函數
④:在事件源類中指定該時間的監聽器(響應者是誰),即注冊監聽

總結注意事項:

1.java采用委托機制處理事件

2.java中的事件是分類的,比如對窗體事件、鼠標事件、按鍵事件、操作事件[按按鈕]

3.java中的一個類要監聽某個事件,則必須實現相應的事件監聽接口

4.事件監聽接口有多種,程序員應當針對不同的情況,實現不同的監聽接口,比如監聽鼠標事件就應當實現MouseListener;要監聽鍵盤事件,就應當實現KeyListener...

5.在實現監聽接口的類(事件監聽者/類)中,需要重寫處理函數,比如實現了ActionListener接口,就應該重寫actionPerformed(ActionEvent e),可以參考前面的事件監聽器接口表格。

6.在事件源中需要注冊事件聽聽類,否則事件監聽類接收不到事件源發生的事件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM