Есть ли способ написать динамический actionlistener для массива ComboBoxes - PullRequest
0 голосов
/ 09 декабря 2018

Я работаю над графическим интерфейсом системы управления базами данных, который динамически создает комбо-боксы в зависимости от количества команд, соревнующихся напрямую;если есть две команды, он создает два комбинированных списка, три команды - три коробки, и так далее, и так далее.Внутри 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 голосов
/ 11 декабря 2018

Так что мне удалось решить это самостоятельно, используя простой цикл 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)
            {
            }
     }
}

Это кажется довольно очевидным после свершившегося факта.Надеюсь, ответ поможет кому-то еще.

...