Java-如何通过单击按钮添加更多文本字段?

Java-如何通过单击按钮添加更多文本字段?,java,swing,jbutton,jtextfield,Java,Swing,Jbutton,Jtextfield,我用Java创建了一个框架,其中有一些文本字段和按钮。假设用户需要更多的文本字段(例如添加更多数据),我想放置一个按钮,当用户单击按钮时,就会出现一个新的文本字段。然后,用户可以通过单击应显示另一个textfield的按钮再次在其中填充数据。 我该怎么做?我需要为按钮编写什么代码,以便通过单击按钮显示越来越多的文本字段? 谢谢大家! 假设您有一个名为panel的主容器和一个按钮变量button,该变量已添加到panel,您可以执行以下操作: // handle the button action

我用Java创建了一个
框架
,其中有一些
文本字段和按钮
。假设用户需要更多的文本字段(例如添加更多数据),我想放置一个
按钮
,当用户单击
按钮
时,就会出现一个新的
文本字段
。然后,用户可以通过单击应显示另一个
textfield
按钮再次在其中填充数据。
我该怎么做?我需要为按钮编写什么代码,以便通过单击按钮显示越来越多的文本字段?

谢谢大家!

假设您有一个名为
panel
的主容器和一个按钮变量
button
,该变量已添加到
panel
,您可以执行以下操作:

// handle the button action event
button.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    // create the new text field
    JTextField newTextField = new JTextField();
    // add it to the container
    panel.add(newTextField);
    panel.validate();
    panel.repaint();
  }
});

添加新文本字段时,可能需要提及一些与布局相关的特征,具体取决于您使用的布局管理器(例如,如果使用
GridBagLayout
,则需要指定约束).

假设您有一个名为
panel
的主容器和一个按钮变量
button
,该变量已添加到
panel
,您可以执行以下操作:

// handle the button action event
button.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    // create the new text field
    JTextField newTextField = new JTextField();
    // add it to the container
    panel.add(newTextField);
    panel.validate();
    panel.repaint();
  }
});

添加新文本字段时,您可能需要提及一些与布局相关的特征,具体取决于您使用的布局管理器(例如,如果您使用
GridBagLayout
,则需要指定约束)。

明智的做法是,不要直接将组件添加到
JFrame
,您可以将它们添加到
JPanel
。虽然与您的问题相关,但请看一看这个小示例,希望能够给您一些提示,否则请问我什么是超出范围的

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JFrameExample
{   
    private JFrame frame;
    private JButton button;
    private JTextField tfield;
    private String nameTField;
    private int count;

    public JFrameExample()
    {
        nameTField = "tField";
        count = 0;
    }

    private void displayGUI()
    {
        frame = new JFrame("JFrame Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(0, 1, 2, 2));
        button = new JButton("Add JTextField");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                tfield = new JTextField();
                tfield.setName(nameTField + count);
                count++;
                frame.add(tfield);
                frame.revalidate();  // For JDK 1.7 or above.
                //frame.getContentPane().revalidate(); // For JDK 1.6 or below.
                frame.repaint();
            }
        });
        frame.add(button);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new JFrameExample().displayGUI();
            }
        });
    }
}

明智的做法是,不要直接将组件添加到
JFrame
,而是将它们添加到
JPanel
。虽然与您的问题相关,但请看一看这个小示例,希望能够给您一些提示,否则请问我什么是超出范围的

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JFrameExample
{   
    private JFrame frame;
    private JButton button;
    private JTextField tfield;
    private String nameTField;
    private int count;

    public JFrameExample()
    {
        nameTField = "tField";
        count = 0;
    }

    private void displayGUI()
    {
        frame = new JFrame("JFrame Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridLayout(0, 1, 2, 2));
        button = new JButton("Add JTextField");
        button.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                tfield = new JTextField();
                tfield.setName(nameTField + count);
                count++;
                frame.add(tfield);
                frame.revalidate();  // For JDK 1.7 or above.
                //frame.getContentPane().revalidate(); // For JDK 1.6 or below.
                frame.repaint();
            }
        });
        frame.add(button);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new JFrameExample().displayGUI();
            }
        });
    }
}

请您提供更多关于您当前代码状态的信息好吗?因此,我们可以猜测新创建的
JTextField
必须位于何处,才能使其在屏幕上看起来令人愉悦。请提供更多有关您是否正在使用
AWT/Swing/JavaFX
的信息?这些输入可能会为您提供更好的洞察力:-)我正在使用Swing。问题是,我无法通过单击JbuttonMay来访问更多JTextFields。请提供与当前代码状态相关的更多信息?因此,我们可以猜测新创建的
JTextField
必须位于何处,才能使其在屏幕上看起来令人愉悦。请提供更多有关您是否正在使用
AWT/Swing/JavaFX
的信息?这些输入可能会为您提供更好的洞察力:-)我正在使用Swing。问题是我无法通过单击JButtonTank you访问更多的JTextFields。我有JFrame而不是panel。所以我替换了panel.add(newTextField);panel.validate();用“JFrame”。但它不起作用。我单击按钮,但没有文本框将添加到框架中。抱歉,我是java新手,这是我的第一个应用;)。感谢+1编写了这个精巧的代码段,尽管有时在将组件添加到已经可见的容器中时也需要
repaint()
。这是我编写的一段代码,我希望通过单击按钮4,会出现一个新的文本字段!它不起作用!ohhh私有void jButton4ActionPerformed(java.awt.event.ActionEvent evt){jButton4.addActionListener(){public void actionPerformed(ActionEvent e){JTextField newTextField=new JTextField();NewJFrame a=new NewJFrame();a.add(newTextField);a.validate();a.repaint();}谢谢。我用JFrame而不是panel。所以我用“JFrame”替换了panel.add(newTextField);panel.validate();但它不起作用。我单击按钮但没有文本框将添加到框架中。很抱歉,我是java新手,这是我的第一个应用;)。感谢+1提供了这段精心编制的代码片段,尽管有时在向已可见的容器中添加组件时也需要使用
repaint()
。这是我编写的一段代码,我希望通过单击按钮4,会出现一个新的文本字段!它不起作用!OHH private void jButton4ActionPerformed(java.awt.event.ActionEvent evt){jButton4.addActionListener(){public void actionPerformed(ActionEvent e){JTextField newTextField=new JTextField();NewJFrame a=new NewJFrame();a.add(newTextField);a.validate();a.repaint();}这是我写的一段代码,我希望通过单击按钮4,会出现一个新的文本字段!它不工作!ohhh private void jButton4ActionPerformed(java.awt.event.ActionEvent evt){jButton4.addActionListener(new ActionListener()){public void actionPerformed(ActionEvent e){JTextField newTextField=new JTextField();NewJFrame a=new NewJFrame();a.add(newTextField);a.validate();a.repaint();}不,不,你在
actionPerformed()中做什么
方法是错误的。您所做的是-您正在创建一个新的JTextField,同时您也在创建一个新的JFrame,并且您将这个JTextField添加到这个新的JFrame中(您从未在任何地方通过编写.setVisible(true)向用户显示过这个JFrame),虽然您从未将此新JTextField添加到以前的JFrame中,但该JFrame是可见的,因此此新添加的内容在任何地方都不可见,因为添加此JTextField的JFrame也是新的,并且您从未将其设置为可见。此外,
revalidate()/repaint()
不会在任何地方使用,而是在添加新组件方面发生变化时使用