728x90

저번에 사용했던 코드 중에 아래와 같은 코드가 있다.


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

+ Recent posts