728x90

이제 여러분들은 컴포넌트와 레이아웃을 배웠다.

이들은 전부 겉모습, 즉 View단이고 이들은 아무 기능도 하지 않는 껍데기일 뿐이다.

이제 비즈니스로직을 달아줄 때가 됬다.

즉 아무 기능도 없는 컴포넌트들에게 생명을 불어넣어줄 것이다.

이러한 것을 이벤트라고 한다.

잠시 용어정리를 해보자.



일단 특정 컴포넌트를 기준으로 이벤트가 발생을 한다. 이벤트라는 것은 여러종류가 있다.

마우스로 클릭을 했다던지 아니면 키보드를 눌렀다던지 등등...

이벤트가 일어났을 때 이벤트를 받는 애들을 이벤트 리스너라고 한다.

또한 이벤트를 일으킨 컴포넌트를 이벤트 소스라고 부른다.

이벤트 리스너가 기본적으로는 존재하지 않는다. 우리는 이때까지 컴포넌트들을 수없이 만들어봤다.

그러나 그러한 컴포넌트들(예를 들자면 버튼)을 눌러도 아무 변화가 없다.

그 이유는 우리가 이벤트를 받는 이벤트 리스너들을 만들지 않았기 때문이다.

만약 이벤트 리스너가 있다면 이제 이벤트가 일어나서할 로직을 우리가 만들 수 있다.

예를들자면 버튼을 눌렀을때 텍스트 필드에 글자를 쓴다든가 하는 기능이다.

이제 백문이 불여 일견이므로 각각의 이벤트를 보도록 하자.

이번에는 Action리스너를 보도록 할 것이다.

이벤트 관련 용어


이벤트 : 이벤트 소스에서 일어난 하나의 사건

이벤트 소스 : 이벤트가 일어난 컴포넌트

이벤트 리스너 : 이벤트를 감지하는 장치


Action Event


가장 먼저 테스트 해볼것은 action이벤트이다.

이 이벤트가 의미하는 액션이라는 것은 각각의 컴포넌트에 걸맞는 가장 기본적인 이벤트를 의미한다.

예를들자면 버튼의 경우 버튼을 클릭했을때, 또한 텍스트필드의 경우 글을 다 친후 엔터를 눌렀을 때 이다.

이 이벤트의 경우 모든 컴포넌트가가지고 있는것은 아니지만 우리가 자주 사용하는 컴포넌트들은 존재하는 경우가 많다.

먼저 버튼에 액션이벤트를 사용한 예시이다.


import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestSwing {

public static void main(String[] args) {
JFrame fr = new JFrame("This 프레임");
JPanel pn = new JPanel();
pn.setLayout(new GridLayout(1, 1));

JButton btn = new JButton("Hi");
btn.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
JButton srcBtn = (JButton) e.getSource();
if (srcBtn.getText().equals("Hi")) {
srcBtn.setText("Hello");
} else {
srcBtn.setText("Hi");
}
}
});
pn.add(btn);

fr.setContentPane(pn);

fr.setSize(500, 500);
fr.setVisible(true);
}
}


중요한 코드는 컴포넌트에서 add리스너 메소드를 사용해서 리스너를 붙혀주는데 리스너는 인터페이스로 되어있다.

따라서 익명클래스나 명시적 클래스를 선언한후 클래스를 배치해줘야한다.

위 코드는 처음에는 버튼이 Hi라고 되어있고 한번 누를때 마다 Hello와 Hi가 반복해서 나타나는 코드이다.


여기서 자세히 봐야할 것은 이부분이다.


@Override

public void actionPerformed(ActionEvent e) {

JButton srcBtn = (JButton)e.getSource();

if(srcBtn.getText().equals("Hi")) {

srcBtn.setText("Hello");

}

else {

srcBtn.setText("Hi");

}

}


이 부분에서 e.getSource()는 위의 JButton btn = new JButton("Hi");와 같은놈이다.

위에 용어설명에서 있지만 이벤트 소스는 이벤트를 일으킨 녀석이라고 했다.

btn이 이벤트를 일으킨 주체이므로 e.getSource()는 btn이 된다.


코드가 좀 길긴 하지만 자동완성을 쓴다면 코딩할 부분은 별로 길지는 않다.


import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TestSwing {

public static void main(String[] args) {
JFrame fr = new JFrame("This 프레임");
JPanel pn = new JPanel();
pn.setLayout(new GridLayout(2, 1));

JButton btn = new JButton("Hi");
JTextField tf = new JTextField();
tf.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
JTextField tf = (JTextField) e.getSource();
btn.setText(tf.getText());
}
});
pn.add(btn);
pn.add(tf);

fr.setContentPane(pn);

fr.setSize(500, 500);
fr.setVisible(true);
}
}


이 코드는 이제 응용이다. 버튼과 텍스트필드가 있다.

텍스트필드의 경우 다치고 나서 엔터를 누르면 버튼의 레이블이 바뀌는 것을 확인할 수 있다.



마찬가지로 이벤트내에서의 getSource의 주체가 바뀐다.

'Programming > Java-Swing' 카테고리의 다른 글

[Swing-07]Evnet-Mouse  (0) 2017.10.25
[Swing-06]Event-Key  (0) 2017.10.24
[Swing-04]Layout(배치관리자)  (0) 2017.10.20
[Swing-03]Component  (0) 2017.10.18
[Swing-02]Swing 시작  (0) 2017.10.18

+ Recent posts