2012-04-26 67 views
1

我现在处于一个尴尬的境地,所以我在这里得到一些专家的意见。我有一个Editable JComboBox。我执行actionPerformed事件,它只是正常工作。但我实施了mouseListener这是行不通的。可编辑JCombobox mouseclicked事件不起作用

component = jcbItemType.getEditor().getEditorComponent(); 
component.addMouseListener(new java.awt.event.MouseListener() { 
    public void mouseClicked(java.awt.event.MouseEvent evt) { 
     jcbItemTypeMouseClicked(evt); 
    } 
    public void mousePressed(java.awt.event.MouseEvent evt) { 
     jcbItemTypeMousePressed(evt); 
    } 
    public void mouseReleased(java.awt.event.MouseEvent evt) { 
     jcbItemTypeMouseReleased(evt); 
    } 
    public void mouseExited(java.awt.event.MouseEvent evt) { 
     jcbItemTypeMouseReleased(evt); 
    } 
    public void mouseEntered(java.awt.event.MouseEvent evt) { 
     jcbItemTypeMouseReleased(evt); 
    } 
}); 

我也曾尝试下面的代码:

Component[] comps = jcbItemType.getComponents(); 
for(int i = 0; i < comps.length; i++) 
{  
    comps[i].addMouseListener(new java.awt.event.MouseAdapter() { 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      jcbItemTypeMouseClicked(evt); 
     } 
     public void mousePressed(java.awt.event.MouseEvent evt) { 
      jcbItemTypeMousePressed(evt); 
     } 
     public void mouseReleased(java.awt.event.MouseEvent evt) { 
      jcbItemTypeMouseReleased(evt); 
     } 
     public void mouseExited(java.awt.event.MouseEvent evt) { 
      jcbItemTypeMouseReleased(evt); 
     } 
     public void mouseEntered(java.awt.event.MouseEvent evt) { 
      jcbItemTypeMouseReleased(evt); 
     } 
    }); 
} 

我知道JComboBox是一个复合元素,因此直接鼠标处理事件将无法正常工作。但我已经使用了单个组件的mouseListener,但它不工作。

有人可能会询问stateChanged事件,但我想在装入物品后加载一些信息,而不是在输入物品的2/3个字符时。在stateChanged事件中,如果它仅在2/3个字符之后显示项目信息,那么它的负载很重,因为我对每个项目的信息都是重度加权的。

所以,我怎么能得到该事件时,通过鼠标选择一个项目单击?

回答

2

以下链接解决我的问题。

http://engin-tekin.blogspot.com/2009/10/hrefhttpkfd.html

从链路的代码片段是以下:

import java.lang.reflect.InvocationTargetException; 
import java.awt.event.MouseAdapter; 
import java.lang.reflect.Field; 
import javax.swing.*; 
import javax.swing.plaf.basic.BasicComboPopup; 
import javax.swing.plaf.basic.BasicComboBoxUI; 
import java.awt.event.MouseEvent; 

/** 
* User: destiny 
* Date: Oct 19, 2009 
* Time: 9:18:34 PM 
*/ 
public class JComboPopupMouseListenerDemo { 

    private static void addPopupMouseListener(JComboBox box) { 
     try { 
        Field popupInBasicComboBoxUI = BasicComboBoxUI.class.getDeclaredField("popup"); 
       popupInBasicComboBoxUI.setAccessible(true); 
       BasicComboPopup popup = (BasicComboPopup) popupInBasicComboBoxUI.get(box.getUI()); 

       Field scrollerInBasicComboPopup = BasicComboPopup.class.getDeclaredField("scroller"); 
       scrollerInBasicComboPopup.setAccessible(true); 
       JScrollPane scroller = (JScrollPane) scrollerInBasicComboPopup.get(popup); 

       scroller.getViewport().getView().addMouseListener(this); 
//    ((JViewport) ((JScrollPane) ((BasicComboPopup) popupInBasicComboBoxUI.get(box.getUI())).getComponents()[0]).getComponents()[0]).getComponents()[0].addMouseListener(this); 
     } 
     catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } 
     catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static MouseAdapter listener() { 
     return new MouseAdapter(){ 
      public void mouseClicked(MouseEvent mouseEvent) { 
       System.out.println("mouseClicked"); 
      } 

      public void mousePressed(MouseEvent mouseEvent) { 
       System.out.println("mousePressed"); 
      } 

      public void mouseReleased(MouseEvent mouseEvent) { 
       System.out.println("mouseReleased"); 
      } 

      public void mouseEntered(MouseEvent mouseEvent) { 
       System.out.println("mouseEntered"); 
      } 

      public void mouseExited(MouseEvent mouseEvent) { 
       System.out.println("mouseExited"); 
      } 
     }; 
    } 

    public static void main(String[] args) throws InvocationTargetException, InterruptedException { 
     JComboBox box = new JComboBox(new String[]{"val 1","val 2","val ......","val 4","val 5","val 6"}); 
     box.setEditable(true); 
     addPopupMouseListener(box); 

     JFrame frame = new JFrame(); 
     frame.add(box); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
}