1. 程式人生 > >TextField和Graphics類

TextField和Graphics類

TextField類

  • java.awt.TextField類用來建立文字框物件
  • TextField有如下常用方法
    • TextField()
    • TextField(int columns)
    • TextField(String text)
    • TextField(String text,int columns)
    • void setText(String t)
    • String getText()
    • void setEchoChar(char c)
    • void setEditable(boolean b)
    • boolean isEditable()
    • void setBackground(Color c)
    • void select(int selectionStart,int selectionEnd)
    • void selectAll()
    • void addActionListener(ActionListener e)

TextField事件監聽

  • TextField物件可能發生Action(游標在文字框內敲回車)事件。與該事件對應的事件類是java.awt.event.ActionEvent
  • 用來處理ActionEvent事件是實現了java.awt.event.ActionListener介面的類的物件,ActionListener介面定義有方法:
    • public void actionPerformed(ActionEvent e)
  • 實現該介面的類要在該方法中新增處理該事件(Action)的語句
  • 使用addActionListener(Action e)方法為TextField物件註冊一個ActionListener物件,當TextField物件發生Action事件時,會生成一個ActionEvent物件,該物件作為引數傳遞給ActionListener物件的actionPerformed方法在方法中可以獲取該物件的資訊,並做相應的處理
import java.awt.*;
import java.awt.event.*;
public class TFActionEvent {
	public static void main(String[] args) {
		new TFFrame
(); } } class TFFrame extends Frame { TFFrame() { TextField tf = new TextField(); add(tf); tf.addActionListener(new TFActionListener()); pack(); setVisible(true); } } class TFActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { TextField tf = (TextField)e.getSource(); System.out.println(tf.getText()); tf.setText(""); } }

這段小程式最重要的部分在於,我需要將TFFrame類中的tf相關資訊傳到TFActionListener中,這樣才能使用tf物件的一些方法,比方說獲取其文字框的內容,修改其文字框的內容等等,但是tf是另一個類的物件,並不是TFActionListener類中的物件,如何獲取呢?之前也說到了,actionPerformed傳入的引數是一個物件,這個物件中有事件發生的所有資訊,其中就有getSource方法,可以返回發生事件的物件,但是返回的是一個Object型別的物件,需要強制轉換為TextField
image

import java.awt.*;
import java.awt.event.*;
public class TFActionEvent2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new TFFrame();
	}

}
class TFFrame extends Frame {
	TFFrame() {
		TextField tf = new TextField();
		add(tf);
		tf.addActionListener(new TFActionListener());
		tf.setEchoChar('*');
		pack();
		setVisible(true);
	}
}
class TFActionListener implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		TextField tf = (TextField)e.getSource();
		System.out.println(tf.getText());
		tf.setText("");
	}
}

這個程式跟上一個程式差不多,就多了一行程式碼tf.setEchoChar(’*’),這個方法的作用是設定回顯字元,就是你輸入的字元,全部用該方法內的字元來替代,比方說我們平時輸入密碼,就由星號替代

加法器

import java.awt.*;
import java.awt.event.*;
public class TFMath {
	public static void main(String[] args) {
		new TFFrame1().launchFrame();
	}
}
class TFFrame1 extends Frame {
	TextField num1,num2,num3;
	public void launchFrame() {
		num1 = new TextField(10);//10字元寬
		num2 = new TextField(10);
		num3 = new TextField(15);
		Label lblplus = new Label("+");
		Button btnEqual = new Button("=");
		btnEqual.addActionListener(new MyMonitor(num1,num2,num3));
		setLayout(new FlowLayout());
		add(num1);
		add(lblplus);
		add(num2);
		add(btnEqual);
		add(num3);
		pack();
		setVisible(true);
	}
}
class MyMonitor implements ActionListener {
	TextField num1,num2,num3;
	public MyMonitor(TextField num1,TextField num2,TextField num3) {
		this.num1 = num1;
		this.num2 = num2;
		this.num3 = num3;
	}
	public void actionPerformed(ActionEvent e) {
		int n1 = Integer.parseInt(num1.getText());
		int n2 = Integer.parseInt(num2.getText());
		num3.setText("" + (n1+n2));
	}
}

持有對方引用實現加法器

import java.awt.*;
import java.awt.event.*;
public class TFMath {
	public static void main(String[] args) {
		new TFFrame1().launchFrame();
	}
}
class TFFrame1 extends Frame {
	TextField num1,num2,num3;
	public void launchFrame() {
		num1 = new TextField(10);//10字元寬
		num2 = new TextField(10);
		num3 = new TextField(15);
		Label lblplus = new Label("+");
		Button btnEqual = new Button("=");
		btnEqual.addActionListener(new MyMonitor(this));
		setLayout(new FlowLayout());
		add(num1);
		add(lblplus);
		add(num2);
		add(btnEqual);
		add(num3);
		pack();
		setVisible(true);
	}
}
class MyMonitor implements ActionListener {
	TFFrame1 tf = null;
	MyMonitor(TFFrame1 tf) {
		this.tf = tf;
	}
	public void actionPerformed(ActionEvent e) {
		int n1 = Integer.parseInt(tf.num1.getText());
		int n2 = Integer.parseInt(tf.num2.getText());
		tf.num3.setText("" + (n1+n2));
	}
}

內部類實現加法器

import java.awt.*;
import java.awt.event.*;
public class TFMath {
	public static void main(String[] args) {
		new TFFrame1().launchFrame();
	}
}
class TFFrame1 extends Frame {
	TextField num1,num2,num3;
	public void launchFrame() {
		num1 = new TextField(10);//10字元寬
		num2 = new TextField(10);
		num3 = new TextField(15);
		Label lblplus = new Label("+");
		Button btnEqual = new Button("=");
		btnEqual.addActionListener(new MyMonitor());
		setLayout(new FlowLayout());
		add(num1);
		add(lblplus);
		add(num2);
		add(btnEqual);
		add(num3);
		pack();
		setVisible(true);
	}
	private class MyMonitor implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			int n1 = Integer.parseInt(num1.getText());
			int n2 = Integer.parseInt(num2.getText());
			num3.setText("" + (n1+n2));
		}
	}
}

Graphics類

  • 每個Component都有一個paint(Graphics g)用於實現繪圖的目的,每次重畫該Component時都自動呼叫paint方法
  • Graphics類中提供了許多繪圖方法,如:
    • drawRect(int x,int y,int width,int height)
    • fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight)
import java.awt.*;
public class TestPaint {
	public static void main(String[] args) {
		new PaintFrame().launchFrame();
	}
}
class PaintFrame extends Frame {
	public void launchFrame() {
		setBounds(200,200,640,480);
		setVisible(true);
	}
	public void paint(Graphics g) {
		Color c = g.getColor();
		g.setColor(Color.red);
		g.fillOval(50,50,30,30);
		g.setColor(Color.green);
		g.fillRect(80,80,40,40);
		g.setColor(c);
	}
}

主函式中並沒有呼叫paint方法,但是其實仔細看上面的說明就會知道,每次重畫的時候都會自動呼叫paint方法,什麼時候會重畫,比方說先把這個視窗隱藏,然後再顯示這個視窗,或者建立這個視窗的時候,都會重畫。使用Graphics 物件的時候,就把這個物件當作一個“畫筆”去理解。最下面有一行將畫筆顏色重新設為c,這個是程式設計的一個好習慣,叫重設現場