构造函数调用或 JFrame 问题
Issue with constructor call or JFrame
我有一个名为 Frame 的 class,它扩展了 JFrame 并实现了 ActionListener,当:
if(e.getSource() == addSpell){
ArrayList<Spell> temp = new ArrayList<Spell>();
for(Spell spell: SpellList.getSpellList()){
if(spell.getType().equals(user.getType())){
temp.add(spell);
}
new SpellArraySorter(temp, this);
this.setVisible(false);
}
被调用,要么 new SpellArraySorter() 被调用 6 次,要么构造函数创建 6 个 jFrames。
public class SpellArraySorter implements ActionListener{
private JButton help;
private JButton enter;
private JFrame frame;
private JTextField level;
private JTextField levelfill;
private JTextField name;
private JTextField namefill;
private JTextField dmg1;
private JTextField dmg2;
private JTextField dmgfill1;
private JTextField dmgfill2;
private Frame f;
private ArrayList<Spell> changedSpellArray;
public SpellArraySorter(ArrayList<Spell> spellArray, Frame f){
this.f = f;
changedSpellArray = new ArrayList<Spell>(spellArray);
frame = new JFrame();
level = new JTextField();
levelfill = new JTextField();
name = new JTextField();
namefill = new JTextField();
dmg1 = new JTextField();
dmg2 = new JTextField();
dmgfill1 = new JTextField();
dmgfill2 = new JTextField();
help = new JButton("HELP");
enter = new JButton("enter");
frame.setLayout(null);
frame.getContentPane().setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setPreferredSize(new Dimension(300, 300));
frame.pack();
frame.setLocationRelativeTo(null);
level.setBounds(30, 35, 100, 20);
levelfill.setBounds(180, 35, 100, 20);
name.setBounds(30, 90, 100, 20);
namefill.setBounds(180, 90, 100, 20);
dmg1.setBounds(30, 145, 100, 20);
dmg2.setBounds(200, 145, 20, 20);
dmgfill1.setBounds(180, 145, 20, 20);
dmgfill2.setBounds(220, 145, 20, 20);
level.setText("Level of Spell: ");
name.setText("name of Spell: ");
dmg1.setText("Damage of Spell: ");
dmg2.setText("d");
level.setEditable(false);
name.setEditable(false);
dmg1.setEditable(false);
dmg2.setEditable(false);
help.setBounds(30, 215, 100, 20);
enter.setBounds(180, 215, 100, 20);
help.addActionListener(this);
enter.addActionListener(this);
frame.add(level);
frame.add(levelfill);
frame.add(name);
frame.add(namefill);
frame.add(dmg1);
frame.add(dmg2);
frame.add(dmgfill1);
frame.add(dmgfill2);
frame.add(help);
frame.add(enter);
frame.setVisible(true);
}
我一辈子都弄不明白为什么,但每次我单击框架 class 的 GUI 上的 addSpell JButton 时,都会出现 class SpellArraySorter 的 6 个 JFrames。
我不确定您是否复制了错误的代码片段,但这对我来说似乎是正常行为。
这一行导致了您的问题:
new SpellArraySorter(temp, this);
原因是因为您仍在 FOR 循环中调用了上面的行。因此,对于 SpellList
中的每个项目,当您使用 new SpellArraySorter(temp, this);
时,您正在创建一个新的 JFrame
试试这个:
if(e.getSource() == addSpell){
ArrayList<Spell> temp = new ArrayList<Spell>();
for(Spell spell: SpellList.getSpellList()){
if(spell.getType().equals(user.getType())){
temp.add(spell);
}
//LINES MOVED FROM HERE
}
//LINES MOVED TO HERE
new SpellArraySorter(temp, this);
this.setVisible(false);
我有一个名为 Frame 的 class,它扩展了 JFrame 并实现了 ActionListener,当:
if(e.getSource() == addSpell){
ArrayList<Spell> temp = new ArrayList<Spell>();
for(Spell spell: SpellList.getSpellList()){
if(spell.getType().equals(user.getType())){
temp.add(spell);
}
new SpellArraySorter(temp, this);
this.setVisible(false);
}
被调用,要么 new SpellArraySorter() 被调用 6 次,要么构造函数创建 6 个 jFrames。
public class SpellArraySorter implements ActionListener{
private JButton help;
private JButton enter;
private JFrame frame;
private JTextField level;
private JTextField levelfill;
private JTextField name;
private JTextField namefill;
private JTextField dmg1;
private JTextField dmg2;
private JTextField dmgfill1;
private JTextField dmgfill2;
private Frame f;
private ArrayList<Spell> changedSpellArray;
public SpellArraySorter(ArrayList<Spell> spellArray, Frame f){
this.f = f;
changedSpellArray = new ArrayList<Spell>(spellArray);
frame = new JFrame();
level = new JTextField();
levelfill = new JTextField();
name = new JTextField();
namefill = new JTextField();
dmg1 = new JTextField();
dmg2 = new JTextField();
dmgfill1 = new JTextField();
dmgfill2 = new JTextField();
help = new JButton("HELP");
enter = new JButton("enter");
frame.setLayout(null);
frame.getContentPane().setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setPreferredSize(new Dimension(300, 300));
frame.pack();
frame.setLocationRelativeTo(null);
level.setBounds(30, 35, 100, 20);
levelfill.setBounds(180, 35, 100, 20);
name.setBounds(30, 90, 100, 20);
namefill.setBounds(180, 90, 100, 20);
dmg1.setBounds(30, 145, 100, 20);
dmg2.setBounds(200, 145, 20, 20);
dmgfill1.setBounds(180, 145, 20, 20);
dmgfill2.setBounds(220, 145, 20, 20);
level.setText("Level of Spell: ");
name.setText("name of Spell: ");
dmg1.setText("Damage of Spell: ");
dmg2.setText("d");
level.setEditable(false);
name.setEditable(false);
dmg1.setEditable(false);
dmg2.setEditable(false);
help.setBounds(30, 215, 100, 20);
enter.setBounds(180, 215, 100, 20);
help.addActionListener(this);
enter.addActionListener(this);
frame.add(level);
frame.add(levelfill);
frame.add(name);
frame.add(namefill);
frame.add(dmg1);
frame.add(dmg2);
frame.add(dmgfill1);
frame.add(dmgfill2);
frame.add(help);
frame.add(enter);
frame.setVisible(true);
}
我一辈子都弄不明白为什么,但每次我单击框架 class 的 GUI 上的 addSpell JButton 时,都会出现 class SpellArraySorter 的 6 个 JFrames。
我不确定您是否复制了错误的代码片段,但这对我来说似乎是正常行为。
这一行导致了您的问题:
new SpellArraySorter(temp, this);
原因是因为您仍在 FOR 循环中调用了上面的行。因此,对于 SpellList
中的每个项目,当您使用 new SpellArraySorter(temp, this);
试试这个:
if(e.getSource() == addSpell){
ArrayList<Spell> temp = new ArrayList<Spell>();
for(Spell spell: SpellList.getSpellList()){
if(spell.getType().equals(user.getType())){
temp.add(spell);
}
//LINES MOVED FROM HERE
}
//LINES MOVED TO HERE
new SpellArraySorter(temp, this);
this.setVisible(false);