我正在为一个项目创建这个软件,我做的是我创建了一个方法" Salad"这里发生的事情是用户可以选择2个沙拉的最大数量。沙拉的名称来自数据库,我动态创建了复选框。
这很好用,我可以获取值并将其插入数据库。然后我想要的是更新插入的row.i创建了一个方法cellForRowAtIndexPath:
用户选择的所有复选框之前。所以我告诉上面我创建这个方法来选择最多2个复选框。当我尝试插入它工作正常..但当我尝试更新ActionListener不起作用。
我在setselected()
没有触发的构造函数中使用setSelected(true)
。我应该在ActionListener
??
Salad()
这就是我填写复选框的方法
public void Salad()
{
int count =0 ;//to count rows in result set
String sql="Select name from foodmenue where type='Salad' and menue='"+selecmenue+"' ";
try {
pst=con.prepareStatement(sql);
rs=pst.executeQuery();
while(rs.next())
{
count++;
}
if(count!=0)
{
rs=pst.executeQuery();
JCheckBox [] a=new JCheckBox[count];
jPanel7.setLayout(new GridLayout());
int x=0;
while(rs.next())
{
a[x]=new JCheckBox(rs.getString("name"));
a[x].setName(rs.getString("name"));
jPanel7.add(a[x]);
a[x].setVisible(true);
a[x].addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if( e.getSource() instanceof JCheckBox){
String s=((JCheckBox) e.getSource()).getName();
if(((JCheckBox) e.getSource()).isSelected())
{
if(selsalad<2)//selsalad is 0 in the bigining
{
selectedsalad[selsalad]=((JCheckBox) e.getSource()).getName();
selsalad=selsalad+1;
}
else
{
((JCheckBox) e.getSource()).setSelected(false);
showMessageDialog(null, "you cant have more than 2 salads");
}
}
if(!((JCheckBox) e.getSource()).isSelected())
{
if(selectedsalad[0].equals(s)|| selectedsalad[1].equals(s) )
{
if(selsalad<2)
{
selectedsalad[selsalad]="";
}
selsalad=selsalad-1;
showMessageDialog(null, selsalad);
}
} }
}
});
x++;
}
}
} catch (Exception e) {
showMessageDialog(null, e);
}
}
MCVE :提供更好的主意
for(Component c : jPanel7.getComponents())
{
if(c instanceof JCheckBox)
{
JCheckBox temp=(JCheckBox) c;
if(temp.getName().equals(s1)){
temp.setSelected(true);
}
if(temp.getName().equals(s2)){
temp.setSelected(true);
}
}
}
答案 0 :(得分:2)
您的问题是,当您以编程方式选择JCheckBox时,您没有更新selsalad。更好的方法是完全摆脱selsalad变量,而是在ActionListener中迭代ArrayList<JCheckBox>
并精确计算已选择的数量。或者让你的JCheckBox数组成为一个字段,改进它的名字并迭代它。
例如:
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
@SuppressWarnings("serial")
public class NewPanel extends JPanel {
private static final int CHECK_BOX_COUNT = 5;
public static final int MAX_SELECTED = 2;
private List<JCheckBox> checkBoxes = new ArrayList<>();
public NewPanel() {
setLayout(new GridLayout(0, 1));
ActionListener actionListener = new CheckBoxListener();
for (int i = 0; i < CHECK_BOX_COUNT; i++) {
String name = "a" + i;
JCheckBox checkBox = new JCheckBox(name);
checkBox.setActionCommand(name);
checkBox.addActionListener(actionListener);
add(checkBox); // add to gui
checkBoxes.add(checkBox); // add to ArrayList
}
checkBoxes.get(1).setSelected(true);
checkBoxes.get(2).setSelected(true);
}
private class CheckBoxListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
int selectedCount = 0;
for (JCheckBox jCheckBox : checkBoxes) {
if (jCheckBox.isSelected()) {
selectedCount++;
}
}
if (selectedCount > MAX_SELECTED) {
Component parent = NewPanel.this;
String msg = String.format("You've selected too many checkboxes as only %d can be selected",
MAX_SELECTED);
String title = "Too Many CheckBoxes Selected";
int type = JOptionPane.ERROR_MESSAGE;
JOptionPane.showMessageDialog(parent, msg, title, type);
((JCheckBox) e.getSource()).setSelected(false);
}
}
}
public List<String> getSelectedActionCommands() {
List<String> resultList = new ArrayList<>();
for (JCheckBox checkBox : checkBoxes) {
if (checkBox.isSelected()) {
resultList.add(checkBox.getActionCommand());
}
}
return resultList;
}
private static void createAndShowGui() {
NewPanel mainPanel = new NewPanel();
int result = JOptionPane.showConfirmDialog(null, mainPanel,
"Select Options", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
System.out.println("Selected Options: " + mainPanel.getSelectedActionCommands());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
答案 1 :(得分:2)
在每个CheckBox的actionListener
上检查所选复选框的数量。当您在选择框上调用setSelected(true)
时,不会调用动作侦听器。
如果要调用动作侦听器,则需要调用doClick()
。
JCheckBox temp=(JCheckBox) c;
if(temp.getName().equals("a1")){
temp.doClick();
}
if(temp.getName().equals("a2")){
temp.doClick();
}
此外,由于两个if语句都在做同样的事情,你可以将它们组合起来。
if(temp.getName().equals("a1") || temp.getName().equals("a2")){
temp.doClick();
}