명품 JAVA Programming 10장 연습문제 정답
명품 JAVA Programming 10장 연습문제 정답
1. ③. 키 이벤트를 처리하는 도중 마우스 이벤트가 발생하면, 현재 이벤트를 모두 처 리한 뒤 다음 이벤트를 처리한다. 이벤트는 발생 순서대로 처리된다.
2. ④ 마우스 드래깅 길이
3. 익명 클래스를 이용하여 다시 작성하면 다음과 같다.
JButton btn = new JButton("Hello");
btn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("Click"); } });
4. 익명 클래스를 이용하여 다시 작성하면 다음과 같다.
JButton btn = new JButton("Hello");
btn.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent e) { System.out.println("Key Released"); } });
5. (1) ActionAdapter는 존재하지 않으며 implements ActionListener로 수정하여야 한다.
class MyActionListener extends ActionAdapter { // implements ActionListener로 수정 public void actionPerformed(ActionEvent e) { System.out.println("Click"); } }
(2) MouseListener를 implements하면 나머지 4개 mouseReleased(), mouseClicked(), mouseEntered(), mouseExited()를 모두 구현하여야 한다. 그러므로 extends MouseAdapter로 수정하여야 한다.
class MyMouseListener implements MouseListener { // extends MouseAdapter로 수정 public void mousePressed(MouseEvent e) { System.out.println("Mouse Pressed"); } }
(3) Key 이벤트가 발생하면 KeyEvent 객체가 생성되고 메소드로 넘어온다. 그러므 로 ActionEvent가 아니라 KeyEvent로 수정하여야 한다.
class MyKeyListener extends KeyAdapter { public void keyTyped(ActionEvent e) { // KeyEvent로 수정 System.out.println("Key Pressed"); } }
6. ① 3 2 1이 순서대로 출력된다. 동일한 이벤트에 대해 여러 개의 리스너를 등록할 수 있으며, 등록된 리스너를 등 록된 순서의 반대로 순으로 실행되며, 모두 실행된다. 정답을 확인하기 위해 다음 코드를 작성해보았다.
import java.awt.*; import java.awt.event.*; import javax.swing.*;
public class MyFrame extends JFrame { public MyFrame() { Container c = getContentPane(); c.setLayout(new FlowLayout()); JButton btn = new JButton("Hello"); c.add(btn); btn.addActionListener(new MyActionListener("1")); btn.addActionListener(new MyActionListener("2")); btn.addActionListener(new MyActionListener("3")); setSize(300,300);
setVisible(true); } public static void main(String [] args) { new MyFrame(); } }
class MyActionListener implements ActionListener { private String msg; public MyActionListener(String msg) { this.msg = msg; } public void actionPerformed(ActionEvent e) { System.out.print(msg + " "); } }
7. ① ItemListener
8. ③ component.requestFocus();
9. <Alt>, <Tab>, <Delete>, <Shift>, <Help>
10. (1)
public void keyPressed(KeyEvent e) { if(e.getKeyChar() == 'a') { System.exit(0); } } }
(2)
public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_ALT) { System.exit(0); } }
이 문제의 테스트를 위한 코드는 다음과 같다.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MyFrame extends JFrame {
public MyFrame() {
Container c = getContentPane();
c.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyChar() == 'a') {
System.exit(0);
}
}
}
);
c.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ALT) {
System.exit(0);
}
}
});
setSize(300,300);
setVisible(true);
c.setFocusable(true);
c.requestFocus(); }
public static void main(String [] args) {
new MyFrame(); } }
11. (1) a 키는 유니코드 키이므로 keyPressed(), keyTyped(), keyReleased() 순으로 호출된다.
(2) <Esc> 키는 유니코드 키가 아니므로 keyPressed(), keyReleased() 순으로 호 출되며, keyTyped()는 호출되지 않는다.
12. (1) 1을 출력한다. 그 이유는 다음과 같다. 마우스를 누르면 contentPane. addMouseListener(new MyMouseListener());로 등록한 마우스 이벤트 리스너 객체인 new MyMouseListener() 객체의 mousePressed()가 실행되어 count는 1 이 되고 마우스를 놓으면 mouseReleased()가 실행되어 count 값 1을 출력한다.
(2) 1을 출력한다. 그 이유는 다음과 같다. 마우스를 누르면 contentPane. addMouseListener(new MyMouseListener());로 등록한 new MyMouseListener() 객체의 mousePressed()가 실행되어 count는 1이 된다. 그러나 마우스를 드래그하면 contentPane.addMouseMotionListener(new MyMouseListener());로 등록한 new MyMouseListener() 객체의 mouseDragged()가 실행되어 0으로 초기화된 count 값을 10으로 증가시킨 다. 마우스를 놓을 때는 처음 마우스 이벤트 리스너의 mouseReleased()가 실 행되어 mousePressed()에 의해 객체 속에 있는 count 값 1을 그대로 출력한 다. count 멤버는 마우스 리스너 객체와 마우스 모션 리스너 객체에 각각 있 기 때문에 mousePressed()와 mouseReleased()는 같은 count를 접근하지만 mouseDragged()는 다른 count를 접근하여 생긴 결과이다.
(3) 이 코드의 경우, new MyMouseListener()로 생성한 객체가 마우스 이벤트 리 스너와 마우스모션 이벤트 리스너로 동시에 작동하도록 등록하였다. 그러므로 mousePressed()나, mouseDragged(), mouseReleased() 모두 count 멤버 변수 를 공유한다. 이제 (1) 질문에 대한 답은 하면, 1이 출력된다. (2)의 경우 mousePressed()에 의해 count 값이 1이 되고, mouseDragged()가 10번 호출되었다면 count 값은 11이 된다. 그리고 mouseReleased()에 의해 출력되므로 화면에는 11이 출력 된다.
13. component.repaint();는 component의 위치나 크기, 색 등에 변화가 생겼으니 다시 그리도록 자바 플랫폼에 요청하는 코드이다. component.revalidate();는 component가 사실상 컨테이너인 경우로, 컨테이너의 자식 컴포넌트들을 다시 배 치하도록 지시하는 코드이다. 컨테이너 내부의 자식 컴포넌트가 삭제되거나 새로 추가된 경우 등으로 컨테이너 내부에 변화가 일어난 경우 호출하면 된다.
'IT > 프로그래밍' 카테고리의 다른 글
명품 JAVA Programming 12장 연습문제 정답 (0) | 2020.12.12 |
---|---|
명품 JAVA Programming 11장 연습문제 정답 (0) | 2020.12.12 |
명품 JAVA Programming 9장 연습문제 정답 (0) | 2020.12.11 |
명품 JAVA Programming 8장 연습문제 정답 (0) | 2020.12.11 |
명품 JAVA Programming 7장 연습문제 정답 (0) | 2020.12.11 |
댓글