1.JTextField

 

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의 코드를 좀더 정리하고 기능을 추가하면 좀더 복잡한 계산기도 만들 수 있다.

 


2. JTextArea

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가 오히려 생소해졌다. 그래도 혹시 나중에 라도 쓸 일이 있을지 모르니까 기록해둔다.

공유하기

facebook twitter kakaoTalk kakaostory naver band