【问题标题】:How to know which JCheckBox sent ItemEvent如何知道哪个 JCheckBox 发送了 ItemEvent
【发布时间】:2013-01-15 07:35:15
【问题描述】:

我的 Swing 项目中有许多复选框。对于每个复选框选择/取消选择一个特定的查询将被执行。我知道获取复选框来源的一种方法是

public void itemStateChanged(ItemEvent e)  {
if(e.getSource=="checkbox object")
{ 
some code goes here; 
}
}

如果我的复选框数量比这个解决方案最好,但如果我有很多复选框,那么我必须编写冗长的代码。有没有办法在单个命令中找到导致事件的复选框对象?

【问题讨论】:

    标签: java swing events checkbox


    【解决方案1】:

    你可以像这样得到选中的复选框

    JCheckBox checkBox1 = new JCheckBox("Check1");
     JCheckBox checkBox2 = new JCheckBox("Check2");
     checkBox1.setName("Check1");
     checkBox2.setName("Check2");
     ItemListener listener = new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent e) {
            JCheckBox check = (JCheckBox)e.getSource();
             String name = check.getName();
             System.out.println(name);
        }
    };
    checkBox1.addItemListener(listener);
    checkBox2.addItemListener(listener);
    

    【讨论】:

    • 我得到的输出为“null”。
    • @RohanKandwal 忘记在复选框中设置名称。 checkBox1.setName("Check1");现在更新。或者你可以使用check.getText()
    • checkBox1.setName("Check1");成功了,但是否可以将复选框对象(例如“checkBox1”)作为输出?
    • @RohanKandwal 更改名称以满足您的需求
    • 如果您可以在复选框名称字符串中放入足够的信息来处理点击,这是一个很好的解决方案。
    【解决方案2】:

    如果您以某种非常统一的方式处理检查,将JChekBoxes 放入HashMap 可能会有所帮助,将它们映射到有助于更轻松地处理事件的某种结构(可能是数据源或某些处理对象)。通过创建、添加和注册复选框的方法可以进一步减少代码量。总体思路是这样的

    HashMap<JCheckBox, String> urls = new HashMap<JCheckBox, String>();   
        // Here I use String but can be any complex data structure.
    
    ActionListener listener = new ActionListener() {        
        public void actionPerformed(ActionEvent e) {
            String url = urls.get(e.getSource());
                        // Work with the selected URL now
        }
    };
    
    void buildCheckBoxes() {
        register("http://wikipedia.org");
        register("http://stackoverflow.com");
                // and 101 others, or load the list from the file.
    }
    
    void register(String url) {
        JCheckBox box = new JCheckBox("Use "+url);
        urls.put(box, url);
        box.addActionListener(listener);
                 // One listener for all, defined above
        myPanel.add(box);
                // Some panel probably with GridLayout
    }
    

    另一方面,如果您的操作非常不同,最好为每个不同的操作设置一个单独的侦听器(可能是内部或匿名类):

        JCheckBox boxA = new JCheckBox("A");
        JCheckBox boxB = new JCheckBox("B");
    
    boxA.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
                   // Only code for boxA
        }
    });
    
    boxB.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
                   // Only code for boxB
        }
    });
    

    一旦侦听器中有更多代码,您应该将其移动到主类的方法中。

    【讨论】:

    • 我还是个菜鸟,还在学习基础知识,所以我不知道这么深的编码
    【解决方案3】:

    如果您想知道哪个组件(CheckBox 或任何其他组件)在 java 中生成了事件,您可以使用“setName(name)”方法为该组件分配名称。

    // For CheckBox
    JCheckBox checkBox1 = new JCheckBox();
    checkBox1.setName("CheckBox1");
    
    // Any other Component
    JButton button1 = new JButton();
    button1.setName("Button1");
    

    现在在监听类中你可以获取产生当前事件的源对象。

    // CheckBox Listener
    public void itemStateChanged(ItemEvent e)  
    {
        JCheckBox source = (JCheckBox)e.getSource();
    
        if(source.getName().equals("CheckBox1"))
        { 
            //some code goes here; 
        }
    }
    

    【讨论】:

    • 我知道equals的使用方式,我已经说过如果我们使用太多的复选框,这种方式会导致代码更长。我想要一个代码来获取复选框的对象,例如“checkBox1”作为输出。
    • Switch 语句可以在 Java 1.7 中与字符串一起使用。
    • 如果您打算对多个组件使用单个侦听器,那么您将进行检查以识别源组件。您可以在 itemStateChanged 方法或其他方法/类中编写它,但最后您将在某处编写它。如果您想避免检查,那么最佳做法是为每个组件编写单独的侦听器。这样你的代码就变得简单而简短,因为你不需要检查来识别源代码。
    • Switch 语句也会占用太多代码行 @vels4j 的解决方案几乎是我所需要的,但该代码也需要使用 setName() 函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多