有没有一种方法可以为ComboBoxes数组编写动态的动作监听器

时间:2018-12-09 20:33:22

标签: java arrays actionlistener jcombobox

我正在使用一个数据库管理系统GUI,该GUI根据直接竞争的团队数量动态创建组合框。如果有两个团队,则创建两个组合框,三个团队,则创建三个组合框,依此类推。在用于初始化和放置组合框的forloop内部,我向每个组合框添加了一个ActionListener。在实现ActionListener的嵌套类中,我有一系列的if,else if语句,用于检查以查看Action的源。我是否需要为每个可能的实例创建单独的检查,或者是否可以使它更具动态性?基本上,我想用选项列表填充第一个组合框,一旦选择了一个选项,我希望将其从后续组合框的选项列表中删除。

else if(e.getSource()==TournamentMatchupCreatebtn)
            {
                String[] MatchCreationOptions = {"Create Match","Cancel"};
                JPanel MatchCreationpnl = new JPanel();
                MatchCreationpnl.setLayout(null);
                Object[] NumofTeamsARGS = {TournamentRestbl.getValueAt(TournamentRestbl.getSelectedRow(), 0).toString()};
                int NumofTeams = Integer.parseInt(dbUpdater.getData(TournamentMatchupHDR,TeamCountqry, NumofTeamsARGS).getValueAt(0, 0).toString());
                System.out.println(NumofTeams);
                String LabelFlag = dbUpdater.getData(MatchTypeHDR,MatchTypeqry,NumofTeamsARGS).getValueAt(0, 0).toString();
                System.out.println(LabelFlag);
                String LabelText;
                if(LabelFlag.equals("Teams"))
                {
                    LabelText = "Team:";
                }
                else
                {
                    LabelText = "Player:";
                }
                 ArrayList<String> PlayersList = new ArrayList<String>();
                DefaultComboBoxModel dcmb = new DefaultComboBoxModel();
                dcmb = dbUpdater.getSpecificValues(MatchTypeqry, NumofTeamsARGS);
                for(int i = 0; i<dcmb.getSize();i++)
                {
                    PlayersList.add(dcmb.getElementAt(i).toString());
                }
                JLabel[] TeamPlayerlbl = new JLabel[NumofTeams];
                TeamPlayercmbx = new JComboBox[NumofTeams];
                JLabel[] VSlbl = new JLabel[NumofTeams];
                for(int i = 0;i<NumofTeams;i++)
                {
                    TeamPlayerlbl[i] = new JLabel(LabelText);
                    if(i==0)
                    {
                    TeamPlayercmbx[i] = new JComboBox(PlayersList.toArray());
                    }
                    else
                    {
                        TeamPlayercmbx[i]= new JComboBox();
                    }

                    VSlbl[i] = new JLabel("VS");
                    TeamPlayerlbl[i].setSize(TeamPlayerlbl[i].getPreferredSize());
                    addComponent(MatchCreationpnl,TeamPlayerlbl[i], 5,i*50+5);
                    addComponent(MatchCreationpnl,TeamPlayercmbx[i],TeamPlayerlbl[i],i*50+5,150,20,5);
                    VSlbl[i].setSize(VSlbl[i].getPreferredSize());
                    if(i<NumofTeams-1)
                    {
                    addComponent(MatchCreationpnl,VSlbl[i],100,i*50+30);
                    }
                    TeamPlayercmbx[i].setEditable(false);
                    TeamPlayercmbx[i].addActionListener(action);
                }
                TeamPlayercmbx[0].setEditable(true);
                TeamPlayercmbx[0].setModel(MatchTypes);

                MatchCreationpnl.setPreferredSize(new Dimension(200,NumofTeams*50+5));
                int x = JOptionPane.showOptionDialog(null,MatchCreationpnl,"Create Tournament Match", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE,null,MatchCreationOptions,null);
            }

该代码创建了用于创建匹配项的界面,我知道我不应该为这些内容设置像素特定的位置,在下一个版本中,我将致力于使界面更加灵活,以适应当前的屏幕显示在。

else if(e.getSource()==TeamPlayercmbx[0])
            {
               ArrayList <String> Competitors = new ArrayList();
               for(int i=0;i<TeamPlayercmbx[0].getItemCount();i++)
               {
                   Competitors.add(TeamPlayercmbx[0].getItemAt(i).toString());
               }
               DefaultComboBoxModel DCMB = new DefaultComboBoxModel(Competitors.toArray());
               TeamPlayercmbx[1].setEditable(true);
               TeamPlayercmbx[1].setModel(DCMB);
               TeamPlayercmbx[1].removeItem(TeamPlayercmbx[0].getSelectedItem());
            }

该代码将从模型中删除所选项目,并允许您为第二个组合框选择一个值。我需要知道的是,是否有替换

的方法
else if(e.getSource()==TeamPlayercmbx[0]

带有类似的内容

else if(e.getSource()==TeamPlayercmbx[some variable]

或者如果我只需要硬编码

1 个答案:

答案 0 :(得分:0)

因此,我设法使用一个简单的for循环自行解决了这个问题:

for(int x =0;x<TeamPlayercmbx.length;x++)
{
      if(e.getSource()==TeamPlayercmbx[x])
      {
            try
            {
                 ArrayList <String> Competitors = new ArrayList();
                 for(int i=0;i<TeamPlayercmbx[x].getItemCount();i++)
                 {               
                       Competitors.add(TeamPlayercmbx[x].getItemAt(i).toString());
                 }
                 DefaultComboBoxModel DCMB = new 
                 DefaultComboBoxModel(Competitors.toArray());
                 TeamPlayercmbx[x+1].setEditable(true);
                 TeamPlayercmbx[x+1].setModel(DCMB);
                 TeamPlayercmbx[x+1].removeItem(TeamPlayercmbx[x].getSelectedItem());
                 }
            catch(Exception ex)
            {
            }
     }
}

事后看来很明显。希望答案可以帮助其他人。