在秋千上选择`JCheckBox`关联`id`

时间:2013-10-03 12:22:13

标签: java swing jcheckbox

在我提出这个问题之前,我经历了很多例子,其中一些是相关的,但没有满足我的需求:

我的列表为keyMessageList,其中id,关联的keyWord字符串

我使用以下代码在我的jpanel上显示keyWord的名称:

    for (KeyMessage obj : keyMessageList) {
        checkBox = new JCheckBox(obj.getSmsKey());
        displayKeywordPanel.checkBooxPanel.add(checkBox);
    }

我得到了以下输出:

output image

现在,我的要求是:如果我选择关键字,我需要获得与所选id相关联的keyword。我在web applications这样做了很多次类似的事情,但是现在我需要在秋千上做同样的事情。我在Web应用程序上使用以下代码来满足要求。 网络代码:

<h:selectOneMenu id="branch" value="#{createUser.branchId}" required="true" requiredMessage="Please choose branch">
          <f:selectItems value="#{allBranch}"/>
</h:selectOneMenu>

任何摇摆专家都可以帮助我。

注意我可以从 JPA 查询中选择多个复选框和keyMessageList返回。

3 个答案:

答案 0 :(得分:3)

  

我有一个列表作为keyWordsList,包括id和相关的keyWord。

不要使用列表。而是使用Map将“keyword”作为键,使用“id”作为值。然后,当您选中一个复选框时,您将从地图中获取ID。

另一种选择是按如下方式创建JCheckBox:

JCheckBox checkBox = new JCheckBox(keyword);
checkbox.setActionCommand( id );

然后,您可以使用getActionCommand()方法访问所选复选框的ID。

答案 1 :(得分:2)

您可以获得displayKeywordPanel.checkBooxPanel.getComponents()数组。遍历数组并存储索引。然后使用索引从keyMessageList

中获取元素

答案 2 :(得分:1)

我认为您可以扩展自己的JCheckBox(让我们说JCheckBoxWithID),以便您保留ID。每次使用ItemListener

选中/取消选中复选框时,请使用List存储/删除ID

通过这种方式,您可以避免迭代checkboxPanel询问被选中的人并分担责任:

  • JCheckBox只显示一个关键字并保存一个ID
  • List只存储选定的ID
  • ItemListener处理选择/取消选择JCheckBox时的事件,并将其ID添加/移出List

希望这个例子有用:

import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Tests {

    private void initGUI(){

        /* This list will store selected ids */
        final List<Integer> selectedIds = new ArrayList<>();

        ItemListener itemListener = new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getSource() instanceof JCheckBoxWithID){
                    JCheckBoxWithID checkBoxWithID = (JCheckBoxWithID) e.getSource();
                    if(checkBoxWithID.isSelected()){
                        selectedIds.add(checkBoxWithID.getId());
                    } else {
                        selectedIds.remove(checkBoxWithID.getId());
                    }
                }
            }
        };

        String[] keyWords = new String[]{"Help 1", "Help 2", "Help 3", "Help 4", "Help 5", "Help 6"};
        Integer id = 0;
        JPanel checkBoxesPanel = new JPanel(new GridLayout(3,3));

        /* Add many checkbox as you keywords you have */
        for(String keyWord : keyWords){
            JCheckBoxWithID checkBoxWithID = new JCheckBoxWithID(keyWord, id);
            checkBoxWithID.addItemListener(itemListener);
            checkBoxesPanel.add(checkBoxWithID);
            id++;
        }

        JButton submit = new JButton("Submit");
        submit.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, Arrays.toString(selectedIds.toArray()), "Selected IDs", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        JPanel content = new JPanel(new FlowLayout(FlowLayout.LEADING));
        content.add(checkBoxesPanel);
        content.add(submit);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

    public static void main(String[] args) {        
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Tests().initGUI();
            }
        });      
    }

    class JCheckBoxWithID extends JCheckBox {
        /* I use Integer but the id could be whatever you want, the concept is the same */
        private Integer _id;

        public JCheckBoxWithID(String text, Integer id) {
            super(text);
            _id = id;
        }

        public void setId(Integer id){
            _id = id;
        }

        public Integer getId(){
            return _id;
        }
    }
}

这是一个打印屏幕:

enter image description here