有没有办法为组合框数组编写动态动作侦听器
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)
{
}
}
}
事后看来很明显。希望答案对其他人有所帮助。
我正在开发一个数据库管理系统 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)
{
}
}
}
事后看来很明显。希望答案对其他人有所帮助。