在我提出这个问题之前,我经历了很多例子,其中一些是相关的,但没有满足我的需求:
我的列表为keyMessageList
,其中id
为长,关联的keyWord
为字符串。
我使用以下代码在我的jpanel上显示keyWord
的名称:
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>
任何摇摆专家都可以帮助我。
注意我可以从 JPA 查询中选择多个复选框和keyMessageList
返回。
答案 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;
}
}
}
这是一个打印屏幕: