컴포넌트를 만드는 목적
비 프로그래머들이 간단한 애플리케이션을 만들 수 있도록 업부 영역 특유의 정보를 패키지화 한다.
소프트웨어 재사용을 촉진한다.
신속한 개발 환경으로 통합한다.
업무를 나눔으로써 특정 분야를 이해하는 프로그래머가 짠 코드를 비전문가들이 사용할 수 있도록 한다.
TextField내에서 내용이 변경되면 특정 행동을 발생시킨다.
- tField에 키보드 입력을 하면 입력값이 숫자인지 아닌지 검사하여 숫자면 tField2에 출력한다.
- 숫자검사로 TextListener인터페이스를 사용한다.
package EventListener;
import java.awt.*;
import java.awt.event.*;
public class TestTextListener extends Frame implements TextListener {
//한개의 메소드만 재정의
//2개의 텍스트 필드선언
TextField tField; //텍스트 입력
TextField tField2; //숫자만 필터링하여 출력
public TestTextListener() {
//텍스트 필드 인스턴스화
tField = new TextField(20);
tField2 = new TextField(20);
tField.addTextListener(this); //키보드 입력을 받을 텍스트 필드만 리스터 등록
add(tField);
add(tField2);
this.setLayout(new FlowLayout());
addWindowListener(new WinCloser());
setTitle("Using a TextListener Object");
setBounds(100,100,400,400);
setVisible(true);
}
public static void main(String[] args) {
TestTextListener ttl = new TestTextListener();
}
//TextListener인터페이스에 의해 요구
//이벤트가 발생한 TextField에 관한 정보를 포함한 TextEvent를 받는다
public void textValueChanged(java.awt.event.TextEvent te) {
//이벤트를 발생시킨 텍스트필드에 대한 핸들을 얻는다.
TextField tf = (TextField)te.getSource();
//텍스트필드의 현재 상태 구현
String s1 = tf.getText();
//마지막으로 입력된 문자를 가진 문자열을 얻기 위해 substring()을 사용한다.
int strlen = s1.length();
String lastCharString = s1.substring(strlen-1);
//입력문자가 정수인지 아닌지 결정하기 위한 에러처리
try {
int i = Integer.parseInt(lastCharString); //문자열이 숫자를 포함하고 있지 않으면 예외
tField2.setText(tField2.getText() + lastCharString); //예외가 던져지면 실행되지 않는다.
}
catch (NumberFormatException nfe) {
System.out.println("not a number");
}
}
}
class WinCloser extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
- 편리하지만 자원의 소비가 높다.
- 일반적으로 GUI프로그램은 필요한 CPU 사이클이 쉽게 사용가능할 정도로 가벼워야 한다.
메소드 : itemStateChanged()
List, Checkbox, Choice같은 객체에서 사용자가 변경할때마다 호출
ItemEvent 제공 메소드 : getItemSelectable()
이벤트를 생성한 항목을 말해준다.
항목서브자료형으로 캐스팅 한다.
사용자가 변경하고자 하는 것을 알기위해 서브자료형의 메소드를 사용
package EventListener;
import java.awt.*;
import java.awt.event.*;
//ItemListener인터페이스를 자체적으로 구현한다.
public class TestCheckBoxes2 extends Frame implements ItemListener {
Checkbox cbWhiteBread;
Checkbox cbWheatBread;
Checkbox cbRyeBread;
Checkbox cbToasted; //체크박스 생성
TextField tField; //텍스트필드 출력
public TestCheckBoxes2() {
//각 체크박스 생성, 상태지정, 리스너 등록
cbWhiteBread = new Checkbox("White Bread");
cbWhiteBread.setState(false);
cbWhiteBread.addItemListener(this);
cbWheatBread = new Checkbox("Wheat Bread");
cbWheatBread.setState(false);
cbWheatBread.addItemListener(this);
cbRyeBread = new Checkbox("Rye Bread");
cbRyeBread.setState(false);
cbRyeBread.addItemListener(this);
cbToasted = new Checkbox("Toasted");
cbToasted.setState(false);
cbToasted.addItemListener(this);
tField = new TextField(30);
setLayout(new FlowLayout());
add(cbWhiteBread);
add(cbWheatBread);
add(cbRyeBread);
add(cbToasted);
add(tField);
addWindowListener(new WinCloser());
setTitle("Using Checkboxes");
setBounds(100,100,300,300);
setVisible(true);
}
public void itemStateChanged(ItemEvent ie) { //ItemEvent객체 넘겨줌
Checkbox cb = (Checkbox)ie.getItemSelectable(); //이벤트를 발생시켰던 항목 전달(형변환)
if(cb.getState()) //체크박스의 현재값을 기준으로 true/false 반환
tField.setText(cb.getLabel() + " was set to true");
else
tField.setText(cb.getLabel() + " was set to false");
}
public static void main(String[] args) {
TestCheckBoxes2 tcb = new TestCheckBoxes2();
}
}
- 최근에 변한 값을 출력한다.
AdjustmentListener인터페이스는 Scrollbar클래스와 관련있다.
Scrollbar의 엘리베이터가 이동될때 AdjustmentEvent가 발생한다.
프로그램에서 Scrollbar의 현재값을 얻어낼수 있고 그것에 반응할수 있다.
package EventListener;
import java.awt.*;
import java.awt.event.*;
public class TestScrollbar extends Frame implements AdjustmentListener {
Scrollbar sb;
TextField tField;
//TestScrollbar인스턴스 생성
public TestScrollbar() {
sb=new Scrollbar(Scrollbar.VERTICAL, 0,1,0,255);
//초기값 0을 갖는 수직 스크롤바를 생성한다
//엘리베이터의 크기는 1이고 최소 0에서 255까지 갖는다
sb.addAdjustmentListener(this); //스크롤바에 리스너 추가
add(sb); //프레임에 스크롤바 추가
tField = new TextField(30);
add(tField);
this.setLayout(new FlowLayout());
addWindowListener(new WinCloser());
setTitle("Using a Scrollbar Object ");
setBounds(100,100,400,400);
setVisible(true);
}
//메소드
public void adjustmentValueChanged(AdjustmentEvent ae) {
String newString = String.valueOf(sb.getValue());
//getvalue()는 int값을 반환하기 때문에 String으로 변환한다.
tField.setText(newString);
}
public static void main(String[] args) {
TestScrollbar tsb = new TestScrollbar();
}
}
class WinCloser extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}