파란하늘의 지식창고
반응형
가령 알럿창을 띄우거나 글을 입력 후 확인 버튼을 누를 필요 없이 엔터를 치면 실행되도록 하고 싶은 경우가 있다.

이럴 때 일반적인 확인 버튼 동작의 구현은
  1. ActionListener를 통해 버튼에 액션이  일어나면 실행
  2. KeyListener를 통해 해당 입력 필드에서 엔터 액션이 일어나면 실행
이와 같이 2개의 구현을 하게 된다.
이에 대한 예제는 아래와 같다.
public class BaseJFrame extends JFrame implements BaseJFrameInterface, ActionListener, KeyListener {
	//프레임을 생성할 내용들이 구현되고
	//...
	///아래와 같이 어떤 입력 필드에 대한 설정을 한다고 가정한다.
	private JPanel setLoginTextFieldPanel() {
		//패널을 만들고
		loginTextFieldPanel = getJPanel();
		loginTextFieldPanel.setLayout(getGridLayout(2, 1, 2, 2));

		//입력을 받을 필드를 만든 후
		accountTextField = getJTextField(8);
		accountTextField.addKeyListener(this);
		passwordTextField = getJPasswordField(8);
		passwordTextField.addKeyListener(this);

		//입력후 확인 버튼을 만들고
		JButton loginButton = getJButton();
		loginButton.setText("확인");
		loginButton.addActionListener(this);
		actionPanel.add(loginButton);

		loginTextFieldPanel.add(accountTextField);
		loginTextFieldPanel.add(passwordTextField);
		loginTextFieldPanel.add(loginButton);
		return loginTextFieldPanel;
	}

	//확인 버튼을 눌렀을 때의 액션
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == loginButton) {
			//...동작을 실행한다.
		}
	}

	//엔터를 눌렀을 때의 액션
	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			//...동작을 실행한다.
		}
	}
}
이에 대해서 우선 ActionCommand를 사용하여 다른 프레임에서 실행하는 경우에 대해서도 대처할수 있도록 하는 것이 좋다.
ActionCommand는 해당 Action에 대해 간단한 String형태의 명령 문장을 달아놓는 것으로 액션이 일어난 소스에 대해서 처리를 하지 않고 해당 액션의 이름별로 처리를 하게 되어 액션을 통합관리할 수 있게 해준다.
아래는 해당 프레임이 ActionListener를 상속하여 실제로 다른 프레임에선 못쓰지만 ActionListener를 따로 생성하면 해당 액션에 대해 재사용이 가능하다.
public class BaseJFrame extends JFrame implements BaseJFrameInterface, ActionListener, KeyListener {
	//프레임을 생성할 내용들이 구현되고
	//...
	///아래와 같이 어떤 입력 필드에 대한 설정을 한다고 가정한다.
	private JPanel setLoginTextFieldPanel() {
		//패널을 만들고
		loginTextFieldPanel = getJPanel();
		loginTextFieldPanel.setLayout(getGridLayout(2, 1, 2, 2));

		//입력을 받을 필드를 만든 후
		accountTextField = getJTextField(8);
		accountTextField.addKeyListener(this);
		passwordTextField = getJPasswordField(8);
		passwordTextField.addKeyListener(this);

		//입력후 확인 버튼을 만들고
		JButton loginButton = getJButton();
		loginButton.setText("확인");
		loginButton.setActionCommand("login"); //해당 버튼에 부여할 액션명령에 대한 명칭을 부여한다.
		loginButton.addActionListener(this);
		actionPanel.add(loginButton);

		loginTextFieldPanel.add(accountTextField);
		loginTextFieldPanel.add(passwordTextField);
		loginTextFieldPanel.add(loginButton);
		return loginTextFieldPanel;
	}

	//확인 버튼을 눌렀을 때의 액션
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand() == "login") { //액션이 일어나는 객체를 확인하는 것이 아닌 ActionCommand를 확인하여 동작을 실행한다.
			//...동작을 실행한다.
		}
	}

	//엔터를 눌렀을 때의 액션
	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_ENTER) {
			//...동작을 실행한다.
		}
	}
}
여기까지 작성한 코드도 언뜻 괜찮아 보이지만 실제로는 동일 액션을 하기 위해 매번 AcitonListener와 KeyListener를 구현해야 하는 것이 좀 불편하다.
이에 대해서 swing에서는 KeyListener를 매번 구현할 필요 없이 KeyAction에 따라 동작할 수 있도록 registerKeyboardAction 메소드를 제공해준다.

public class BaseJFrame extends JFrame implements BaseJFrameInterface, ActionListener {
	//프레임을 생성할 내용들이 구현되고
	//...
	///아래와 같이 어떤 입력 필드에 대한 설정을 한다고 가정한다.
	private JPanel setLoginTextFieldPanel() {
		//패널을 만들고
		loginTextFieldPanel = getJPanel();
		loginTextFieldPanel.setLayout(getGridLayout(2, 1, 2, 2));

		//입력을 받을 필드를 만든 후
		accountTextField = getJTextField(8);
		accountTextField.registerKeyboardAction(this, "login", KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), JComponent.WHEN_FOCUSED);
		passwordTextField = getJPasswordField(8);
		passwordTextField.registerKeyboardAction(this, "login", KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), JComponent.WHEN_FOCUSED);

		//입력후 확인 버튼을 만들고
		JButton loginButton = getJButton();
		loginButton.setText("확인");
		loginButton.setActionCommand("login"); //해당 버튼에 부여할 액션명령에 대한 명칭을 부여한다.
		loginButton.addActionListener(this);
		actionPanel.add(loginButton);

		loginTextFieldPanel.add(accountTextField);
		loginTextFieldPanel.add(passwordTextField);
		loginTextFieldPanel.add(loginButton);
		return loginTextFieldPanel;
	}

	//확인 버튼을 눌렀을 때의 액션
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand() == "login") { //액션이 일어나는 객체를 확인하는 것이 아닌 ActionCommand를 확인하여 동작을 실행한다.
			//...동작을 실행한다.
		}
	}
}
ActionCommand에 따라 actionPerformed에서 해당 동작을 실행하도록 통합이 되었다.
반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요