JTextField에는 사용자로부터 값을 입력받을 수 있다. 이 속성을 이용해서 계산기를 만들수 있다.
아래 예제의 계산기는 간단한 덧셈 뺄셈 정도를 하는 용도로 사용할 수 있다.
생성자에서 텍스트 필드 3개와 버튼 2개를 배치한다. Layout Manager를 사용하면 편하겠지만 지금은 setLayout(null)로 진행한다. 텍스트 필드 3개중 아래쪽 배치되는 1개는 setEditable 을 false로 한다. 색깔이 배경색이 되면서 값을 바꿀 수 없게 된다. 여기에 계산한 값을 표시할 것이다.
이벤트 구현은 ActionListener 로 구현한다. 버튼 2개에 addActionListener 를 등록한다. this는 인스턴스 자신을 말한다.(new SwingEX4) 오버라이드할 것은 ActionPerformed 메소드이다. 이벤트가 발생하면 두 텍스트필드의 현재값을 가져온다. (.getText) 이들은 String 형이다. 따라서 형변환을 해준다.
다음은 어느쪽이 눌렸는지를 알아야 한다. ActionEvent 클래스의 메소드인 e.getSource( ) 는 이벤트가 발생한 위치값을 반환한다. 위치라는 것은 어디에서 클릭이 발생했는가이다. tf1이면 텍스트필드 영역이고, bt1면 버튼을 클릭한 것이다. 여기서는 두개의 버튼만 등록했다. e.getSource == bt1 조건식으로 확인이 분기할 수 있다.
결과는 setText로 세번째 텍스트필드에 할당된다.
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class SwingEX4 extends JFrame implements ActionListener{
int count = 0;
Font f1;
JTextField tf1,tf2,tf3;
JButton bt1,bt2;
SwingEX4(){
f1 = new Font("배달의민족 도현",Font.PLAIN,30);
//JTextField
tf1 = new JTextField();
tf1.setBounds(50,70,200,40);
tf1.setFont(f1);
tf2 = new JTextField();
tf2.setBounds(50,120,200,40);
tf2.setFont(f1);
tf3 = new JTextField("Answer");
tf3.setBounds(50,190,200,40);
tf3.setEditable(false);
tf3.setFont(f1);
bt1 = new JButton("+");
bt1.setBounds(50, 270, 70, 50);
bt1.setFont(f1);
bt2 = new JButton("-");
bt2.setBounds(160, 270, 70, 50);
bt2.setFont(f1);
// ActionListener
bt1.addActionListener(this);
bt2.addActionListener(this);
//JFrame
add(tf1);add(tf2);add(tf3);
add(bt1);add(bt2);
setTitle("JButton EX");
setSize(300,400);
setLayout(null);
setVisible(true);
}
public static void main(String[] args) {
new SwingEX4();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String str1 = tf1.getText();
String str2 = tf2.getText();
int a = Integer.parseInt(str1);
int b = Integer.parseInt(str2);
int c = 0;
if(e.getSource() == bt1) {
c = a+b;
}else if (e.getSource() == bt2) {
c = a-b;
}
String res = String.valueOf(c);
tf3.setText(res);
}
}
Swing의 코드를 좀더 정리하고 기능을 추가하면 좀더 복잡한 계산기도 만들 수 있다.
JTextArea는 텍스트에디터 처럼 여러줄에 걸쳐서 문자열을 입력받을 수 있다. JTextField 처럼 getText()로 문자열을 가져올 수 있다. 텍스트 property 인 만큼 사용법이 비슷하다. 컴포넌트들이 다 부모가 같기 때문에 어딘가 닮은 구석이 있도록 설계되었다. 아니 상속을 한 것이니까 닮은 건 당연한건가. 어쨋든 다들 인스턴스 생성하고 setBounds로 위치와 크기를 한번에 배치한다.
아래 예제에서는 String 클래스의 split을 사용하여 문자열에 있는 공백을 기준으로 단어로 쪼갠다. 즉 text란 긴 문자열을 word라는 객체배열(문자열 배열)로 분리해서 저장시킨다. 과정은 아래의 그림과 같다.
public class SwingEX6 extends JFrame{
int count = 0;
Font f1;
SwingEX6(){
f1 = new Font("바탕",Font.BOLD,17);
//JLabel
JLabel lb1 = new JLabel("단어 :");
lb1.setBounds(50,35,100,30);
lb1.setFont(f1);
//JLabel
JLabel lb2 = new JLabel("문자 :");
lb2.setBounds(150,35,100,30);
lb2.setFont(f1);
// JTextArea
JTextArea jt1 = new JTextArea();
jt1.setBounds(50, 75, 200, 200);
jt1.setFont(f1);
// JButton
JButton bt1 = new JButton("Count");
bt1.setBounds(50, 300, 100, 30);
bt1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String text = jt1.getText();
String words[] =text.split("\\s");
lb1.setText("단어 :" + words.length);
lb2.setText("문자 :" + text.length());
}
});
add(jt1);add(lb1);add(lb2);add(bt1);
setTitle("JButton EX");
setSize(320,400);
setLayout(null);
setVisible(true);
}
public static void main(String[] args) {
new SwingEX6();
}
}
요새는 웹을 거의 쓰기 때문에 이런 GUI가 오히려 생소해졌다. 그래도 혹시 나중에 라도 쓸 일이 있을지 모르니까 기록해둔다.