3

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

我有一个列表,keyMessageList其中包括idLong关联keyWordString

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

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

我得到以下输出:

输出图像

现在,我的要求是:如果我选择关键字,我需要获取id与所选keyword. 我已经多次做过类似的事情web applications,但现在我需要在挥杆上做同样的事情。我在 Web 应用程序上使用了以下代码来满足要求。网页代码:

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

任何挥杆专家都可以帮助我。

注意我可以选择多个复选框并keyMessageListJPA查询返回。

4

3 回答 3

3

我有一个 keyWordsList 列表,其中包括 id 和关联的 keyWord。

不要使用列表。而是使用Map带有“关键字”作为键和“id”作为值的 a。然后,当您选择一个复选框时,您会从地图中获取 ID。

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

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

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

于 2013-10-03T14:42:58.990 回答
2

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

于 2013-10-03T12:28:48.603 回答
1

我认为您可以扩展自己的JCheckBox(比如说JCheckBoxWithID),让您保留 id。然后在List每次使用ItemListener选中/取消选中复选框时使用 a 来存储/删除 id

这样,您将避免重复checkboxPanel询问谁被选中并保持分离的职责:

  • JCheckBox只显示一个关键字并持有一个 id
  • List只存储选定的 ID
  • ItemListener当 a 被选中/取消选中时处理事件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;
        }
    }
}

这是一个打印屏幕:

在此处输入图像描述

于 2013-10-03T13:06:55.227 回答