有没有办法为组合框数组编写动态动作侦听器

Is there a way to write a dynamic actionlistener for an array of ComboBoxes

我正在开发一个数据库管理系统 GUI,它可以根据直接竞争的团队数量动态创建组合框;如果有两个团队,它会创建两个组合框,如果有三个团队,它会创建三个框,依此类推。在初始化和放置组合框的 forloop 内部,我为每个组合框添加了一个 ActionListener。在我实现 ActionListener 的嵌套 class 中,我有一系列 if、else if 语句来检查操作的来源。我是否需要为每个可能的实例创建一个单独的检查,或者有没有办法让它更动态?基本上我想用选项列表填充第一个组合框,一旦一个选项被 selected 我希望它从后续组合框的选项列表中删除。

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

该代码从模型中删除 selected 项目,并允许您 select 第二个组合框的值。我需要知道的是是否有办法替换

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

类似于

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

或者如果我需要硬编码出来

所以我设法用一个简单的 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)
            {
            }
     }
}

事后看来很明显。希望答案对其他人有所帮助。