Java JFrame:如何添加一个按钮,在框架中添加一个新的文本字段?

Java JFrame:如何添加一个按钮,在框架中添加一个新的文本字段?,java,swing,user-interface,jframe,jtextfield,Java,Swing,User Interface,Jframe,Jtextfield,我对Java还很陌生,我想我会尝试弄脏我的双手,制作一个GUI,但我似乎无法让它按照我想要的方式工作 我编写了一些代码,认为如果我按下GUI上的“添加”按钮,那么一个新的JTextField将出现在所有其他文本字段的下方,但这不会发生。只有一个新的JTextField出现,但它出现在我的Add按钮旁边,而不是我所有其他文本字段的下面,如果我再次按下它,什么也不会发生。我试着使用其他变量,但它似乎不能正常工作。我觉得我的ActionListener有些问题,但我不知道是什么 public clas

我对Java还很陌生,我想我会尝试弄脏我的双手,制作一个GUI,但我似乎无法让它按照我想要的方式工作

我编写了一些代码,认为如果我按下GUI上的“添加”按钮,那么一个新的JTextField将出现在所有其他文本字段的下方,但这不会发生。只有一个新的JTextField出现,但它出现在我的Add按钮旁边,而不是我所有其他文本字段的下面,如果我再次按下它,什么也不会发生。我试着使用其他变量,但它似乎不能正常工作。我觉得我的ActionListener有些问题,但我不知道是什么

public class TheGUI extends JFrame{
    List<JTextField> listOfTextFields = new ArrayList<JTextField>();

    private JTextField desc1;
    private JTextField instruct;
    private JTextField desc2;
    private JButton submit;
    private JButton addNew;

    public TheGUI() { //My GUI with the default fields & buttons that should be on there.
        super("Chili");
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();


        instruct = new JTextField("Choose your words");
        instruct.setEditable(false);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 0;
        add(instruct, c);

        addNew = new JButton("Add");
        c.weightx = 0.0;
        c.gridx = 1;
        c.gridy = 0;
        add(addNew, c);

        submit = new JButton("Submit!");
        c.weightx = 0.5;
        c.gridwidth = 2;
        c.gridx = 0;
        c.gridy = GridBagConstraints.PAGE_END;
        add(submit, c);

        desc1 = new JTextField(10);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridwidth = 2;
        c.gridx = 0;
        c.gridy = 1;
        add(desc1, c);

        desc2 = new JTextField(10);
        c.fill = GridBagConstraints.HORIZONTAL;
        c.weightx = 0.5;
        c.gridwidth = 2;
        c.gridx = 0;
        c.gridy = 2;
        add(desc2, c);

        addNew.addActionListener(new Adder());


        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(300,300);
        setVisible(true);

    }

    private class Adder implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent event) {

            int i = 0;
            listOfTextFields.add(new JTextField());
            GridBagConstraints textFieldConstraints = new GridBagConstraints();

             //Give it a max of 9 text fields that can be created.
            while(i < 10) {
                textFieldConstraints.fill = GridBagConstraints.HORIZONTAL;
                textFieldConstraints.weightx = 0.5;
                textFieldConstraints.gridx = 0;
                textFieldConstraints.gridwidth = 2;
                textFieldConstraints.gridy = 3 + i;
                i++;

            }

            add(listOfTextFields.get(i), textFieldConstraints);
            revalidate();
            repaint();


        }

    }


}

GUI扩展JFrame的公共类{ List listOfTextFields=new ArrayList(); 私有JTextField desc1; 私人现场指导; 私有JTextField desc2; 私有JButton提交; 私有JButton addNew; public TheGUI(){//My GUI,其中包含应位于其中的默认字段和按钮。 超级(“辣椒”); setLayout(新的GridBagLayout()); GridBagConstraints c=新的GridBagConstraints(); 指令=新JTextField(“选择你的单词”); 指令.setEditable(false); c、 填充=GridBagConstraints.HORIZONTAL; c、 权重x=0.5; c、 gridx=0; c、 gridy=0; 添加(指示,c); addNew=新的JButton(“添加”); c、 权重x=0.0; c、 gridx=1; c、 gridy=0; 新增(新增,c); 提交=新的JButton(“提交!”); c、 权重x=0.5; c、 网格宽度=2; c、 gridx=0; c、 gridy=GridBagConstraints.PAGE\u END; 添加(提交,c); desc1=新的JTextField(10); c、 填充=GridBagConstraints.HORIZONTAL; c、 权重x=0.5; c、 网格宽度=2; c、 gridx=0; c、 gridy=1; 增加(说明1,c); desc2=新的JTextField(10); c、 填充=GridBagConstraints.HORIZONTAL; c、 权重x=0.5; c、 网格宽度=2; c、 gridx=0; c、 gridy=2; 添加(描述2,c); addNew.addActionListener(newadder()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 设置大小(300300); setVisible(真); } 私有类加法器实现ActionListener{ @凌驾 已执行的公共无效操作(操作事件){ int i=0; 添加(新的JTextField()); GridBagConstraints textFieldConstraints=新的GridBagConstraints(); //最多可以创建9个文本字段。 而(i<10){ textFieldConstraints.fill=GridBagConstraints.HORIZONTAL; textFieldConstraints.weightx=0.5; textFieldConstraints.gridx=0; textFieldConstraints.gridwidth=2; textFieldConstraints.gridy=3+i; i++; } 添加(listOfTextFields.get(i),textFieldConstraints); 重新验证(); 重新油漆(); } } }
您的while循环非常奇怪

您的
ActionListener
应该如下所示:

 private class Adder implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            if (listOfTextFields.size() == 9) {
                // Give it a max of 9 text fields that can be created.
                return;
            }

            JTextField textfield = new JTextField();

            listOfTextFields.add(textfield);
            GridBagConstraints textFieldConstraints = new GridBagConstraints();
            textFieldConstraints.fill = GridBagConstraints.HORIZONTAL;
            textFieldConstraints.weightx = 0.5;
            textFieldConstraints.gridx = 0;
            textFieldConstraints.gridwidth = 2;
            textFieldConstraints.gridy = 3 + listOfTextFields.size();

            add(textfield, textFieldConstraints);

            revalidate();
            repaint();

        }

    }

你的while循环真的很奇怪

您的
ActionListener
应该如下所示:

 private class Adder implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent event) {
            if (listOfTextFields.size() == 9) {
                // Give it a max of 9 text fields that can be created.
                return;
            }

            JTextField textfield = new JTextField();

            listOfTextFields.add(textfield);
            GridBagConstraints textFieldConstraints = new GridBagConstraints();
            textFieldConstraints.fill = GridBagConstraints.HORIZONTAL;
            textFieldConstraints.weightx = 0.5;
            textFieldConstraints.gridx = 0;
            textFieldConstraints.gridwidth = 2;
            textFieldConstraints.gridy = 3 + listOfTextFields.size();

            add(textfield, textFieldConstraints);

            revalidate();
            repaint();

        }

    }

未验证,但
int i=0
后跟
,而(i>10){}
看起来可疑。由于您将
i
初始化为零,while循环将永远不会执行(
i
永远不会大于10),谢谢Thomas!我应该注意到的。我已经做了更改,但是在那之后,当我尝试按add按钮时出现错误“IndexOutofBoundsException:索引10超出长度1的界限。看起来我可以在正确的空格中添加一个框,但只能在按add 10次后添加。我需要做更多的深入研究。未验证,但
inti=0
后跟
,而(i>10){}
看起来可疑。由于您将
i
初始化为零,while循环将永远不会执行(
i
永远不会大于10),谢谢Thomas!我应该注意到的。我已经做了更改,但是在那之后,当我尝试按add按钮时出现错误“IndexOutofBoundsException:索引10超出长度1的界限。看起来我可以在正确的空格中添加一个框,但只能在按add 10次后添加。我需要做更多的研究。哦,哇!谢谢它起作用了。我有点不明白你是怎么做到的。我认为如果没有循环,这是行不通的,我认为“ListofTextFields.size()”需要在括号内有一个值。您不需要循环,因为您一次只添加一个文本字段。一旦添加了文本字段,就不会对其进行修改。“括号内的值”是什么意思?不,没关系,我知道你对ListofTextFields.size()做了什么。这是给列表中元素的数量,然后让它成为“gridy”的新值你是个了不起的家伙,Julien。再次感谢!哦,哇!谢谢它起作用了。我有点不明白你是怎么做到的。我认为如果没有循环,这是行不通的,我认为“ListofTextFields.size()”需要在括号内有一个值。您不需要循环,因为您一次只添加一个文本字段。一旦添加了文本字段,就不会对其进行修改。“括号内的值”是什么意思?不,没关系,我知道你对ListofTextFields.size()做了什么。这是给列表中元素的数量,然后让它成为“gridy”的新值你是个了不起的家伙,Julien。再次感谢!