저번에 사용했던 코드 중에 아래와 같은 코드가 있다.
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) {
}
}
이 때 한번 포커스에 관련된 이야기를 했었다.
key리스너를 발동하기 위해서는 포커스가 존재해야한다고 말했었다.
그리고 레이블의 경우에는 일반적으로는 포커스를 얻을 수 없다고 하였다.
그렇다. 일반적으로는 포커스를 얻을 수 없다. 일반적이지 않은 경우에는 포커스를 얻을 수 있다는 이야기로 귀결된다.
그러면 일단 레이블에 강제로 포커스를 주고싶다.
포커스를 주려면 어떻게 해야할까?
사실 포커스라는 것은 속성에 불과하다.
즉 특정 이벤트가 발생했을때 해당 컴포넌트에 포커스를 줘라. 이런식으로 코딩하는것 역시 가능하다.
아래는 그 예제이다.
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JComponent;
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());
lbl.addMouseListener(new MyMouseListener());
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) {
}
}
class MyMouseListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
((JComponent) e.getSource()).requestFocus();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
저번에 했던것 처럼 클릭하고(포커스를 얻고) 키 이벤트를 줘봐라.
이제 레이블에서도 정상적으로 작동이 된다.
특정 컴포넌트에서 포커스를 주는 메소드는 바로 requestFocus메소드이다.
위의 코드를 해석하면 레이블에 마우스 이벤트를줘서 클릭을 하면 포커스를 얻도록 하는 메소드이다.
이제 이 코드를 바탕으로 포커스이벤트를 작동시켜보자.
따라서 아래와 같이 코드를 짜보자.
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JComponent;
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());
lbl.addMouseListener(new MyMouseListener());
lbl.addFocusListener(new MyFocuseListener());
tf.addKeyListener(new MyKeyListener());
tf.addFocusListener(new MyFocuseListener());
btn.addKeyListener(new MyKeyListener());
btn.addFocusListener(new MyFocuseListener());
ls.addKeyListener(new MyKeyListener());
ls.addFocusListener(new MyFocuseListener());
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) {
}
}
class MyMouseListener implements MouseListener {
@Override
public void mouseClicked(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
((JComponent) e.getSource()).requestFocus();
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
class MyFocuseListener implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
System.out.println(e.getSource().getClass().getName());
System.out.println("MyFocuseListener.focusGained()");
}
@Override
public void focusLost(FocusEvent e) {
System.out.println(e..getSource().getClass().getName());
System.out.println("MyFocuseListener.focusLost()");
}
}
이제 포커스를 얻으면 콘솔에 포커스를 얻었는지 얻지 못하였는지 확인할 수있다.
여기서 잘보면 항상 포커스를 얻으면 반대편에서 포커스를 잃는 것을 알 수 있다.
포커스를 누군가 얻는다는것은 포커스를 누군가는 잃게 된다는것을 의미한다.
왜냐하면 항상 포커스는 단 하나만 존재하는 것이 가능하기 때문이다.
FocuseListener의 메소드
focusGained : 포커스를 획득할 때 발생
focusLost : 포커스를 잃을 때 발생
'Programming > Java-Swing' 카테고리의 다른 글
[Swing-10]Event-Window, 프로세서 종료하기 (0) | 2017.10.27 |
---|---|
[Swing-08]Evnet-Item (0) | 2017.10.27 |
[Swing-07]Evnet-Mouse (0) | 2017.10.25 |
[Swing-06]Event-Key (0) | 2017.10.24 |
[Swing-05]Event-Action (0) | 2017.10.21 |