java – 有没有办法阻止动作侦听器在调用setSelectedItem()时触
发布时间:2020-12-15 02:33:52 所属栏目:Java 来源:网络整理
导读:我有一个包含多个组合框的程序,每个组合框都有自己的动作监听器.从任何组合框中选择项目将改变一个或多个其他组合框中的项目.我遇到的问题是,为一个组合框调用setSelectedItem()会触发另一个组合框的动作监听器,而组合框又会触发其他组合的动作监听器等. 有
我有一个包含多个组合框的程序,每个组合框都有自己的动作监听器.从任何组合框中选择项目将改变一个或多个其他组合框中的项目.我遇到的问题是,为一个组合框调用setSelectedItem()会触发另一个组合框的动作监听器,而组合框又会触发其他组合的动作监听器等.
有没有办法避免这种情况,或者通过仅允许从用户输入触发动作侦听器,或者通过检测到动作未从用户输入触发?假设不使用setSelectedItem()不是一个选项,因为我希望程序能够为每个comboxbox设置当前选定的项目.在此先感谢您的帮助. 解决方法
例如
import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; public class ComboBoxTwo extends JFrame implements ActionListener,ItemListener { private static final long serialVersionUID = 1L; private JComboBox mainComboBox; private JComboBox subComboBox; private Hashtable<Object,Object> subItems = new Hashtable<Object,Object>(); public ComboBoxTwo() { String[] items = {"Select Item","Color","Shape","Fruit"}; mainComboBox = new JComboBox(items); mainComboBox.addActionListener(this); mainComboBox.addItemListener(this); //prevent action events from being fired when the up/down arrow keys are used //mainComboBox.putClientProperty("JComboBox.isTableCellEditor",Boolean.TRUE); getContentPane().add(mainComboBox,BorderLayout.WEST); subComboBox = new JComboBox();// Create sub combo box with multiple models subComboBox.setPrototypeDisplayValue("XXXXXXXXXX"); // JDK1.4 subComboBox.addItemListener(this); getContentPane().add(subComboBox,BorderLayout.EAST); String[] subItems1 = {"Select Color","Red","Blue","Green"}; subItems.put(items[1],subItems1); String[] subItems2 = {"Select Shape","Circle","Square","Triangle"}; subItems.put(items[2],subItems2); String[] subItems3 = {"Select Fruit","Apple","Orange","Banana"}; subItems.put(items[3],subItems3); // mainComboBox.setSelectedIndex(1); } @Override public void actionPerformed(ActionEvent e) { String item = (String) mainComboBox.getSelectedItem(); Object o = subItems.get(item); if (o == null) { subComboBox.setModel(new DefaultComboBoxModel()); } else { subComboBox.setModel(new DefaultComboBoxModel((String[]) o)); } } @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { if (e.getSource() == mainComboBox) { if (mainComboBox.getSelectedIndex() != 0) { FirstDialog firstDialog = new FirstDialog(ComboBoxTwo.this,mainComboBox.getSelectedItem().toString(),"Please wait,Searching for ..... "); } } } } private class FirstDialog extends JDialog { private static final long serialVersionUID = 1L; FirstDialog(final Frame parent,String winTitle,String msgString) { super(parent,winTitle); setModalityType(Dialog.ModalityType.APPLICATION_MODAL); JLabel myLabel = new JLabel(msgString); JButton bNext = new JButton("Stop Processes"); add(myLabel,BorderLayout.CENTER); add(bNext,BorderLayout.SOUTH); bNext.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { setVisible(false); } }); javax.swing.Timer t = new javax.swing.Timer(1000,new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }); t.setRepeats(false); t.start(); setLocationRelativeTo(parent); setSize(new Dimension(400,100)); setVisible(true); } } public static void main(String[] args) { JFrame frame = new ComboBoxTwo(); frame.setDefaultCloSEOperation(EXIT_ON_CLOSE); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |