Java2程序設計基礎第十四章課後習題

  1. 簡述Graphics類的特徵。
    Graphics類是java.awt包中一個特殊的抽象類,當要在屏幕上繪製圖形、文本、圖像時,並不需要直接使用new運算符來創建一個Graphics類的對象實例,而是可以直接使用,Graphics類所產生的對象就是被成爲繪畫環境的“繪圖區域”。與一般類不同的是,被稱爲“繪圖區域”的對象並不需要通過Graphics類的構造方法來創建,而是通過getGraphics()方法來取得。有了這個“繪圖區域”後,便可以利用Graphics類所提供的各種各樣的繪圖方法來進行圖形繪製,
  2. Java語言中提供的用於顯示、更新和重畫圖形的方法有哪幾個?
    圖形顯示:public void paint(Graphics g);
    更新圖形:public void update(Graphics g);
    重畫圖形:public void repaint(); public void repaint(int x, int y, int width, int height);
  3. paint()方法什麼情況發生時會自動被調用。
    (1)當新建窗口顯示在顯示器上或從隱藏變成顯示時;
    (2)從縮小圖標還原爲正常顯示之後;
    (3)正在改變窗口的大小時。
  4. 編寫一個畫圖的程序,用戶可以用單選按鈕組或下拉列表框選擇所要繪製的圖形,如線、圓、橢圓、矩形等,選擇後可以通過拖動鼠標的方式在屏幕上畫出相應的圖形。
import java.awt.*;
import java.awt.event.*;

public class exe14_4 extends Frame implements ItemListener, MouseMotionListener, MouseListener {
	
	static exe14_4 frm = new exe14_4();
	
	static Checkbox cb1 = new Checkbox("線");
	static Checkbox cb2 = new Checkbox("圓");
	static Checkbox cb3 = new Checkbox("橢圓");
	static Checkbox cb4 = new Checkbox("矩形");
	static Choice cho = new Choice();
	
	static final int LINE = 0;
	static final int CIRCLE = 1;
	static final int OVAL = 2;
	static final int RECT = 3;
	
	int px1, py1, px2, py2;
	static int status = 0, sharp = 0;
	int rpx1, rpy1, rpx2, rpy2;
	
	public static void main(String[] args) {
		CheckboxGroup grp = new CheckboxGroup();
		cb1.setCheckboxGroup(grp);
		cb2.setCheckboxGroup(grp);
		cb3.setCheckboxGroup(grp);
		cb4.setCheckboxGroup(grp);
		cb1.addItemListener(frm);
		cb2.addItemListener(frm);
		cb3.addItemListener(frm);
		cb4.addItemListener(frm);
		
		cho.add("線");
		cho.add("圓");
		cho.add("橢圓");
		cho.add("矩形");
		cho.addItemListener(new MyItemListener());
		
		frm.setTitle("exe14_4");
		frm.setLocation(200, 150);
		frm.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 10));
		frm.setSize(400, 300);
		frm.add(cb1);
		frm.add(cb2);
		frm.add(cb3);
		frm.add(cb4);
		frm.add(cho);
		
		frm.addMouseMotionListener(frm);
		frm.addMouseListener(frm);
		
		frm.setVisible(true);
	}
	
	public void itemStateChanged(ItemEvent e) {
		Checkbox cb = (Checkbox) e.getSource();
		if (cb == cb1) {
			sharp = LINE;
		} else if (cb == cb2) {
			sharp = CIRCLE;
		} else if (cb == cb3) {
			sharp = OVAL;
		} else if (cb == cb4) {
			sharp = RECT;
		}
	}
	
	public void mouseMoved(MouseEvent e) {
		px1 = e.getX();
		py1 = e.getY();
		status = 0;
	}
	
	public void mouseDragged(MouseEvent e) {
		Graphics g = getGraphics();
		g.setColor(Color.yellow);
		g.setXORMode(Color.black);
		if (status == 1) {
			switch (sharp) {
				case LINE:
					g.drawLine(px1, py1, e.getX(), e.getY());
					break;
				case CIRCLE:
					g.drawOval(px1, py1, px2, px2);
					break;
				case OVAL:
					g.drawOval(px1, py1, px2, py2);
					break;
				case RECT:
					g.drawRect(px1, py1, px2, py2);
					break;
			}
		} else {
			px1 = e.getX();
			py1 = e.getY();
			status = 1;
		}
		px2 = Math.abs(e.getX() - px1);
		py2 = Math.abs(e.getY() - py1);
		switch (sharp) {
			case LINE:
				g.drawLine(px1, py1, e.getX(), e.getY());
				break;
			case CIRCLE:
				g.drawOval(px1, py1, px2, px2);
				break;
			case OVAL:
				g.drawOval(px1, py1, px2, py2);
				break;
			case RECT:
				g.drawRect(px1, py1, px2, py2);
				break;
		}
		rpx1 = px1;
		rpy1 = py1;
		rpx2 = px2;
		rpy2 = py2;
	}
	
	public void mouseReleased(MouseEvent e) {
		Graphics g = getGraphics();
		g.setColor(Color.red);
		switch (sharp) {
			case LINE:
				g.drawLine(rpx1, rpy1, e.getX(), e.getY());
				break;
			case CIRCLE:
				g.drawOval(rpx1, rpy1, rpx2, rpx2);
				break;
			case OVAL:
				g.drawOval(rpx1, rpy1, rpx2, rpy2);
				break;
			case RECT:
				g.drawRect(rpx1, rpy1, rpx2, rpy2);
				break;
		}
	}
	
	public void mousePressed(MouseEvent e) {}
	public void mouseEntered(MouseEvent e) {}
	public void mouseExited(MouseEvent e) {}
	public void mouseClicked(MouseEvent e) {}
	
	static class MyItemListener implements ItemListener {
		public void itemStateChanged(ItemEvent e) {
			String clr = cho.getSelectedItem();
			if (clr == "線") {
				sharp = LINE;
			} else if (clr == "圓") {
				sharp = CIRCLE;
			} else if (clr == "橢圓") {
				sharp = OVAL;
			} else if (clr == "矩形") {
				sharp = RECT;
			}
		}
	}
}

注:練習均爲博主自己編寫,不是標準答案,可能存在問題,可以留言討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章