2014-01-20 6 views
1

У меня есть JComboBox, который при щелчке должен обновлять содержимое JLabel. Я в настоящее время использую MouseListener, чтобы определить, когда пользователь нажимает на JComboBox как так:Java Swing JComboBox, mouseListener не работает

myComboBox.getEditor().getEditorComponent().addMouseListener(
      new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      updateMyJLabel(evt); 
      } 
     }); 

У меня нет никаких проблем на самом деле обновляет JLabel за пределами этого фрагмента. Я ранее настроил его так, чтобы я мог изменить содержимое JComboBox, а затем щелкнуть JButton, чтобы обновить JLabel, и он отлично работал. Тем не менее, быстро стало утомительно нажимать кнопку каждый раз, когда мне нужно обновить JLabel. Но когда я добавляю myComboBox в макет после использования вышеуказанного кода, код никогда не выполняется. Я также попытался поставить заявление печати выше вызова updateMyJLabel, но даже это ничего не делало, консоль была красиво, разочаровывающе пустым.

Это только мой второй день попытки развития ui, так что извините, если это глупый вопрос. Я прочитал здесь целый ряд других вопросов о SO, и некоторые люди заявили, что не используют mouseListener на JComboBox, другие сказали, что такой код отлично работает для них, поэтому я немного смущен, почему это не так, т работы.

Любые предложения и помощь с благодарностью.

+0

Почему вы не можете просто сделать myComboBox.addMouseListener (...) '? –

+0

@JoshM Потому что 'JComboBox' является составным компонентом, и поэтому событие мыши, вероятно, не пузырится. –

ответ

2

См. JComboBox.addItemListener(ItemListener). Он надежно работает на мыши или клавиатуре выбор.

+0

Спасибо, это сработало отлично! Спасло меня много неприятностей. Это почти неловко, как легко было исправить. – user2816570

+0

Добро пожаловать. :) –

1

Добавление мышь к JComboBox всегда будет проблемой. Он, как правило, реализуется PL & Fs как контейнер других компонентов. (Конечно, PL & F может выбрать что-то другое, разбивая множество хитроумных кодов.) События мыши ведут себя очень необычно, пузырь до родителя содержит, если на текущем компоненте нет прослушивателей мыши. Добавление прослушивателя мыши изменяет поведение компонента.

(я всегда положить @Override при попытке переопределить метод. Удивительно, насколько часто и запутанное это, чтобы получить это неправильно. Также MouseAdapter немного противная, как вы можете использовать его в качестве MouseListener или MouseMotionListener.)

Я не совсем уверен, что вы пытаетесь сделать. Вероятно, добавление слушателя к модели со списком будет иметь наибольший смысл. Если вы хотите надежно добавить слушателя мыши, вам, вероятно, потребуется перейти на «стеклянную панель».

1

вот пример для вас

import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.event.ItemEvent; 
import java.awt.event.ItemListener; 

import javax.swing.JComboBox; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

public class Main { 
    public static void main(String args[]) { 
     JFrame frame = new JFrame("Demo Frame/SuRu"); 
     Container contentPane = frame.getContentPane(); 
     contentPane.setLayout(new FlowLayout(FlowLayout.LEFT)); 
     final JLabel jLabel = new JLabel(); 
     final JComboBox box = new JComboBox(); 
     box.addItem(""); 
     box.addItem("Item 1"); 
     box.addItem("Item 2"); 
     box.addItem("Item 3"); 
     box.addItem("Item 4"); 
     box.addItem("Item 5"); 
     box.addItem("Item 6"); 
     box.addItem("Item 7"); 
     box.addItem("Item 8"); 
     box.addItem("Item 9"); 
     box.addItem("Item 10"); 
     contentPane.add(new JLabel("Select Here: ")); 
     contentPane.add(box); 
     contentPane.add(new JLabel("Seleced Item: ")); 
     contentPane.add(jLabel); 
     box.addItemListener(new ItemListener() { 

      @Override 
      public void itemStateChanged(ItemEvent arg0) { 
       jLabel.setText(box.getSelectedItem().toString()); 
      } 
     }); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setBounds(200, 200, 400, 100); 
     frame.setVisible(true); 
    } 
} 
Смежные вопросы