2012-04-03 3 views
0

JComboBox에 ItemListener를 추가했습니다. ItemListener는 마우스 클릭 또는 스페이스 바를 사용하여 내가 선택한 선택을 감지 할 수 있습니다. 그러나 Enter 키를 인식하지 못합니다. 즉, 화살표 키를 사용하여 ComboBox의 항목을 스크롤 한 다음 Enter 키를 누르면 itemStateChanged 메서드가 호출되지 않습니다. 아이디어가 있습니까? MouseEvent 변경 사항의 청취스윙에서 Enter 키가 콤보 박스에서 요소를 선택하는 데 작동하지 않습니다.

+2

시도한 코드를 공유 할 수 있습니까? 그건 디버깅하는 데 도움이됩니다. –

답변

0
  • 누르면 ENTER key의 청취 SELECTED/DESELECTED

  • 을 발사,이 ItemListener있다가 ActionListener

  • 키 이벤트의 나머지는 JComboBox에의 JList의

  • 에서 결정하는 것이 가능하다

예를 들면

import java.awt.Component; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.plaf.basic.BasicComboBoxRenderer; 

public class ComboBoxHoverOver { 

    private JComboBox combo = new JComboBox(); 

    public ComboBoxHoverOver() { 
     combo.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXXXX"); 
     combo.setRenderer(new ComboToolTipRenderer(combo)); 
     combo.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent e) { 
       System.out.println(combo.getSelectedItem().toString()); 
      } 
     }); 
     combo.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       System.out.println(combo.getSelectedItem().toString()); 
      } 
     }); 
     combo.addItem(""); 
     combo.addItem("Long text 4"); 
     combo.addItem("Long text 3"); 
     combo.addItem("Long text 2"); 
     combo.addItem("Long text 1"); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(combo); 
     f.pack(); 
     f.setVisible(true); 
    } 

    private class ComboToolTipRenderer extends BasicComboBoxRenderer { 

     private static final long serialVersionUID = 1L; 
     private JComboBox combo; 
     private JList comboList; 

     ComboToolTipRenderer(JComboBox combo) { 
      this.combo = combo; 
     } 

     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      if (comboList == null) { 
       comboList = list; 
       KeyAdapter listener = new KeyAdapter() { 

        @Override 
        public void keyReleased(KeyEvent e) { 
         if (e.getKeyCode() == KeyEvent.VK_DOWN || e.getKeyCode() == KeyEvent.VK_UP) { 
          int x = 5; 
          int y = comboList.indexToLocation(comboList.getSelectedIndex()).y; 
          System.out.println(comboList.getSelectedIndex()); 
         } 
        } 
       }; 
       combo.addKeyListener(listener); 
       combo.getEditor().getEditorComponent().addKeyListener(listener); 
      } 
      if (isSelected) { 
       System.out.println(value.toString()); 
      } 
      return this; 
     } 
    } 

    public static void main(String[] args) { 

     java.awt.EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ComboBoxHoverOver comboBoxHoverOver = new ComboBoxHoverOver(); 
      } 
     }); 
    } 
} 
+0

-1 keyListener 및 random (읽기 : 질문과 관련이없는) 코드 용입니다. 기억해야 할 점은 답안의 코드는 SSCCE뿐 아니라 질문의 코드가되어야합니다 :-) – kleopatra

관련 문제