加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读