2016-08-02 2 views
0

Я пытаюсь вызвать функцию, когда пользователь нажимает (с помощью мыши) на элемент в JComboBox; однако я не хочу, чтобы это событие запускалось для каких-либо событий клавиатуры - я только хочу, чтобы это было сделано для щелчка по определенной ячейке выпадающего списка (я знаю о addActionListener и addItemListener, но они увольняются для большего количества событий, чем я хочу).JComboBox mouseClicked on cell

EDIT: Я должен был указать, что mouseClicked тоже не работает - никаких событий не срабатывает (однако они были в какой-то момент, но когда это произошло, они также стреляли по щелчкам в текстовое поле), но Я думал, что это взято из названия.

Я также попытался Приведенным решением здесь (также не работает): Editable JCombobox mouseclicked event not working

EDIT2: Я попытался следующий, но до сих пор нет вывода по щелчку:

try { 
    Field popupInBasicComboBoxUI = BasicComboBoxUI.class.getDeclaredField("popup"); 
    popupInBasicComboBoxUI.setAccessible(true); 
    BasicComboPopup popup = (BasicComboPopup)popupInBasicComboBoxUI.get(attachedCB.getUI()); 

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

    scroller.getViewport().getView().addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
     super.mouseClicked(e); 
     System.out.println("nope"); 
     } 
    }); 
    } 
    catch (IllegalAccessException e) { 
    e.printStackTrace(); 
    } 
    catch (NoSuchFieldException e) { 
    e.printStackTrace(); 
    } 
+0

Вы должны добавить MouseListener к Всплывающие не JComboBox как пример говорится здесь: http://engin-tekin.blogspot.com/2009/10/hrefhttpkfd.html ли вы попробовать это и не работает? Если да, то где вы используете другой ЛАФ? – Jayfray

+0

См. EDIT2, не работает :( – user235236

+0

Попробуйте добавить слушателя в JList из popup.getList() – Jayfray

ответ

2

Вы пропустили добавление его в окно просмотра scrollPane в ссылке, которую я разместил в комментариях.

Field scrollerInBasicComboPopup = BasicComboPopup.class.getDeclaredField("scroller"); 
scrollerInBasicComboPopup.setAccessible(true); 
JScrollPane scroller = (JScrollPane) scrollerInBasicComboPopup.get(popup); 
scroller.getViewport().getView().addMouseListener(listener); 
+0

Я пробовал это, все еще нет, полный код находится в EDIT2 – user235236

+0

Я не получаю mouseClicked, но я получаю mousePressed и mouseReleased. Вам нужно будет использовать их. Измените ваш mouseAdapter, чтобы использовать методы mousePressed и/или mouseReleased. – Jayfray

+0

Отлично! Это сработает! – user235236

0

Надеется, что это помогает,

jComboBox.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
       jComboBoxMouseClicked(evt);//your logic here 
      }    
     }); 
+0

К сожалению, это именно то, что я пробовал ... Ничего не происходит. – user235236

0

Вы должны использовать java.awt.event.ActionEvent, который (цитата из Javadoc) а

Семантическое событие, которое указывает, что произошло событие, определенное компонентом . Это событие высокого уровня генерируется компонентом (например, как Button), когда происходит действие компонента специфических (например, как быть нажата) ...

так:

 jComboBox.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       javax.swing.JComboBox source = (javax.swing.JComboBox)evt.getSource(); 
       // use getSelectedIndex to know the item if needed 
       labelTextField.setText(source.getSelectedItem().toString()); 
      } 
     }); 

Примечание getSelectedItem и getSelectedIndex и getSelectedObjects методы: это позволяет узнать, какой элемент был выбран и обрабатывать только элементы, которые вы хотите

+0

Это также срабатывает на клавиатурных событиях, что неприемлемо. – user235236

Смежные вопросы