ActionBox没有触发ActionListener类

时间:2015-09-26 17:21:05

标签: java swing constructor actionlistener dynamic-programming

我正在为一个项目创建这个软件,我做的是我创建了一个方法" 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);
           }
       }
   } 

2 个答案:

答案 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();
}