μž‘μ„±: 2026-03-04 11:23:35μˆ˜μ •: 2026-03-04 11:23:35

Java Swing 이벀트 처리: μ‚¬μš©μžμ™€μ˜ μƒν˜Έμž‘μš© μ΄ν•΄ν•˜κΈ°

μžλ°” μŠ€μœ™(Java Swing) μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λ²„νŠΌ 클릭, ν‚€λ³΄λ“œ μž…λ ₯ λ“± μ‚¬μš©μžμ˜ λ™μž‘μ„ μ²˜λ¦¬ν•˜λŠ” 핡심 λ©”μ»€λ‹ˆμ¦˜μ€ 이벀트 λ¦¬μŠ€λ„ˆ(Event Listener) λͺ¨λΈμž…λ‹ˆλ‹€. 2026λ…„ κΈ°μ€€ ν˜„λŒ€μ μΈ μžλ°” 문법(λžŒλ‹€μ‹ λ“±)을 ν™œμš©ν•œ 효율적인 이벀트 처리 방법을 μ •λ¦¬ν•©λ‹ˆλ‹€.


1. 이벀트 λ¦¬μŠ€λ„ˆ λͺ¨λΈμ˜ ꡬ쑰

μŠ€μœ™μ˜ 이벀트 μ²˜λ¦¬λŠ” 'λ°œμƒμ§€(Source)', '이벀트 객체(Event Object)', **'λ¦¬μŠ€λ„ˆ(Listener)'**의 μ„Έ μš”μ†Œλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

  1. Source: μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ (예: JButton)
  2. Event Object: λ°œμƒν•œ μ΄λ²€νŠΈμ— λŒ€ν•œ 정보λ₯Ό 담은 객체 (예: ActionEvent)
  3. Listener: 이벀트λ₯Ό κ°μ‹œν•˜κ³  μžˆλ‹€κ°€ λ°œμƒ μ‹œ λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€ (예: ActionListener)

2. μ£Όμš” 이벀트 처리 방법

β‘  λ²„νŠΌ 클릭 처리 (ActionListener)

κ°€μž₯ 많이 μ“°μ΄λŠ” λ°©μ‹μž…λ‹ˆλ‹€. κ³Όκ±°μ—λŠ” 읡λͺ… 클래슀λ₯Ό μΌμ§€λ§Œ, ν˜„μž¬λŠ” λžŒλ‹€μ‹μ„ μ‚¬μš©ν•˜μ—¬ κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•©λ‹ˆλ‹€.

JButton button = new JButton("ν΄λ¦­ν•˜μ„Έμš”");
 
// λžŒλ‹€μ‹μ„ μ΄μš©ν•œ 이벀트 처리
button.addActionListener(e -> {
    System.out.println("λ²„νŠΌμ΄ ν΄λ¦­λ˜μ—ˆμŠ΅λ‹ˆλ‹€!");
    JOptionPane.showMessageDialog(null, "μ•ˆλ…•ν•˜μ„Έμš”!");
});

β‘‘ 마우슀 및 ν‚€λ³΄λ“œ 이벀트

νŠΉμ • μ»΄ν¬λ„ŒνŠΈ μœ„λ‘œ 마우슀λ₯Ό μ˜¬λ¦¬κ±°λ‚˜ ν‚€λ³΄λ“œ ν‚€λ₯Ό λˆ„λ₯΄λŠ” λ™μž‘μ„ κ°μ§€ν•©λ‹ˆλ‹€.

  • MouseListener: mouseClicked, mouseEntered, mouseExited λ“± 처리.
  • KeyListener: keyPressed, keyReleased λ“± 처리.

Tip: λͺ¨λ“  λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œν•˜κΈ° λ²ˆκ±°λ‘­λ‹€λ©΄ MouseAdapterλ‚˜ KeyAdapterλ₯Ό 상속받아 ν•„μš”ν•œ λ©”μ„œλ“œλ§Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


3. μ€‘μš”: 이벀트 처리 μ‹œ μ£Όμ˜μ‚¬ν•­ (EDT와 μŠ€λ ˆλ“œ)

μ§€λ‚œ κΈ€μ—μ„œ κ°•μ‘°ν–ˆλ“―, μŠ€μœ™μ€ μ‹±κΈ€ μŠ€λ ˆλ“œ λͺ¨λΈμž…λ‹ˆλ‹€. 이벀트 λ¦¬μŠ€λ„ˆ λ‚΄λΆ€μ˜ μ½”λ“œλŠ” **EDT(Event Dispatch Thread)**μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.

  • κΈˆμ§€ 사항: λ¦¬μŠ€λ„ˆ λ‚΄λΆ€μ—μ„œ λ„€νŠΈμ›Œν¬ 톡신, λŒ€μš©λŸ‰ 파일 읽기 λ“± '무거운 μž‘μ—…'을 직접 μˆ˜ν–‰ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€. μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ 화면이 λ©ˆμΆ”κ²Œ λ©λ‹ˆλ‹€.
  • ν•΄κ²° 방법: μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” μž‘μ—…μ€ SwingWorker 클래슀λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μ²˜λ¦¬ν•œ λ’€, UI μ—…λ°μ΄νŠΈλ§Œ λ‹€μ‹œ SwingUtilities.invokeLater()둜 λ„˜κ²¨μ•Ό ν•©λ‹ˆλ‹€.
button.addActionListener(e -> {
    new Thread(() -> {
        // 1. 무거운 μž‘μ—… μˆ˜ν–‰ (예: DB 쑰회)
        String data = fetchDataFromDB(); 
        
        // 2. UI μ—…λ°μ΄νŠΈλŠ” λ‹€μ‹œ EDTμ—μ„œ μ‹€ν–‰
        SwingUtilities.invokeLater(() -> {
            label.setText(data);
        });
    }).start();
});

4. μš”μ•½

  • κ°„λ‹¨ν•œ μ•‘μ…˜μ€ λžŒλ‹€μ‹κ³Ό ActionListener둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • λ³΅μž‘ν•œ 마우슀/ν‚€λ³΄λ“œ λ™μž‘μ€ Adapter 클래슀λ₯Ό ν™œμš©ν•΄ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μœ μ§€ν•©λ‹ˆλ‹€.
  • μ‚¬μš©μž κ²½ν—˜μ„ μœ„ν•΄ 무거운 μž‘μ—…μ€ λ°˜λ“œμ‹œ 별도 μŠ€λ ˆλ“œλ‘œ λΆ„λ¦¬ν•©λ‹ˆλ‹€.

이벀트 처리λ₯Ό λ§ˆμŠ€ν„°ν•˜λ©΄ 정적인 UI에 생λͺ…λ ₯을 λΆˆμ–΄λ„£μ„ 수 μžˆμŠ΅λ‹ˆλ‹€.