【问题标题】:Issue with constructor call or JFrame构造函数调用或 JFrame 的问题
【发布时间】:2016-04-27 22:34:25
【问题描述】:

我有一个名为 Frame 的类,它扩展了 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 个 jFrame。

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

我终生无法弄清楚为什么,但每次我在 Frame 类的 GUI 上单击 addSpell JButton 时,都会出现 6 个 SpellArraySorter 类的 JFrame。

【问题讨论】:

    标签: java constructor jframe call


    【解决方案1】:

    我不确定您是否复制了代码 sn-p 错误,但这在我看来是正常行为。

    此行导致您的问题:

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

    【讨论】:

    • 我不小心删除了右括号,并且至少四次错过了那个错误。谢谢!
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2011-08-23
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多