728x90

저번에는 action 이벤트에 대해서 했다.

이벤트는 여러종류가 있다. 이번에 해볼 이벤트는 key이벤트이다.

key이벤트는 말그대로 키보드의 이벤트를 받는 것이다.

key이벤트는 총 3가지의 종류가 있다.

아래의 예시를 보자.


import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
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));

JLabel lbl = new JLabel("Typed : ");
JTextField tf = new JTextField();
tf.addKeyListener(new KeyListener() {

@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.VK_BACK_SPACE) {
if (!lbl.getText().equals("Typed : ")) {
lbl.setText(lbl.getText().substring(0, lbl.getText().length() - 1));
}
} else {
lbl.setText(lbl.getText() + e.getKeyChar());
}
}

@Override
public void keyReleased(KeyEvent e) {
}

@Override
public void keyPressed(KeyEvent e) {

}
});
pn.add(lbl);
pn.add(tf);

fr.setContentPane(pn);

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


새로운 리스너로 이번에는 key리스너를 붙혔다.

key이벤트는 앞의 action이벤트와는 달리 총 3가지의 이벤트로 되어있다. 각각의 의미는 아래와같다.


key event


keyTyped - 키가 타이핑 됬을때 발생하는 이벤트. 말그대로 타이핑이 되야하므로 타이핑이 되지 않는 보조키는 작동치 않음.

keyReleased - 어떤 키던 상관없이 키가 놓아졌을 때 발생하는 이벤트

keyPressed - 어떤 키던 상관없이 키가 눌러졌을 때 발생하는 이벤트


위의 예제는 하나의 레이블과 하나의 텍스트필드가 나오며 텍스트필드에 입력한 내용이 레이블에 출력된다.

이때 예제를 유심히 보자. KeyEvent에서 getKeyChar라는 메소드를 사용하였다.

키 이벤트에는 여러메소드가 있는데 이중 getKeyChar는 타이핑된 문자를 받는것이다.

눌러진 키를 확인하는 메소드들은 아래와 같은 종류가 있다.


KeyEvent메소드


getKeyChar - 타이핑된 key값을 반환. 사실상 키보드랑은 무관하게 타이핑된 값을 반환.

getKeyCode - 타이핑된 키보드의 배치에 따른 값을 정수로 반환. 이 메소드덕분에 왼쪽 ctrl과 오른쪽 ctrl들을 구별가능

getkeyLocation -  키보드의 배치를 총 4군데로 나누는데 1이 키보드 전체, 2가 왼쪽 보조키, 3이 오른쪽 보조키, 4가 키패드

paramString - key보드에 관련된 전체 파라메터 반환

getWhen - 얼마나 눌러졌는지

isControlDown - Control이 눌러졌는지

isShiftDown - Shift가 눌러졌는지

isAltDown - Alt가 눌러졌는지

isMetaDown = Meta키가 눌러졌는지(맥으로 따지면 cmd, 윈도우에서는 window,몇몇 키보드에 존재하는 meta키)


자신에게 맞는 메소드를 사용해서 key의 상태를 세분화 해서 볼 수 있다.


포커스


포커스는 다른 이벤트도 있는데 어찌되었던 포커스를 설명하지 않고서는 key이벤트는 완벽하지 않다.

아래의 예제를 한번 보자.


import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
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, 2));

JLabel lbl = new JLabel("Label");
JTextField tf = new JTextField();
JButton btn = new JButton("Button");
JList<String> ls = new JList<>();

lbl.addKeyListener(new MyKeyListener());
tf.addKeyListener(new MyKeyListener());
btn.addKeyListener(new MyKeyListener());
ls.addKeyListener(new MyKeyListener());
pn.add(lbl);
pn.add(tf);
pn.add(btn);
pn.add(ls);

fr.setContentPane(pn);

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

class MyKeyListener implements KeyListener {

@Override
public void keyPressed(KeyEvent e) {

}

@Override
public void keyReleased(KeyEvent e) {
System.out.println(e.getSource().getClass().getName());
}

@Override
public void keyTyped(KeyEvent e) {

}

}


이 예제는 콘솔과 함께한다. 콘솔에서 한번 실행시켜보자.



보다시피 위에 이벤트리스너는 Label,Button,List,TextField에 모두 장착되어있다.

그러면 여기서 키이벤트는 모두가 동시에 발생할까?

해보면 그렇지 않다는것을 알 수있다.

각각의 구역을 클릭하고 키보드를 눌려야만 이벤트가 발생한다.

예를들면 텍스트 필드에는 내부에 커서(캐럿이라고도 부르는 것)가 있어야만 키보드 이벤트가 발생하며

리스트의 경우에도 리스트 내부를 선택한 상태에서(현재 리스트 내부에 넣어준건 없지만) 키보드를 입력해야하며

Button도 선택표시가 떠야만 이벤트가 발생한다.

이렇게 특정 컴포넌트가 선택되어야만 이벤트가 발생하며 이렇게 컴포넌트가 선택되어 있는 것을 포커스라고부른다.


포커스를 모두 설명하기에는 조금 내용이 길어지고 포커스이벤트역시 존재하므로 그때 설명토록 하겠다.

그런데 Label은 이벤트가 발생하지 않는데 왜냐하면 Label은 일반적으로는 포커스를 얻을 수 없다.

즉 선택상태가 될수 없다는 것이다. 이는 원래 Label이 관상용이기 때문에 그런것이다.

물론 나중에 내부로직으로 강제로 포커스를 주는 방법이 있지만 이는 나중에 설명토록 하겠다.


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

[Swing-08]Evnet-Item  (0) 2017.10.27
[Swing-07]Evnet-Mouse  (0) 2017.10.25
[Swing-05]Event-Action  (0) 2017.10.21
[Swing-04]Layout(배치관리자)  (0) 2017.10.20
[Swing-03]Component  (0) 2017.10.18

+ Recent posts