Java 使用方法添加JTextField时从JTextField检索文本

Java 使用方法添加JTextField时从JTextField检索文本,java,swing,jpanel,jtextfield,Java,Swing,Jpanel,Jtextfield,我目前正在学习如何在Java中使用Swing。在向JPanel添加JTextFields、JLabel或JButtons时,我通常使用以下4行代码: gbc.gridx = 0; gbc.gridy = 0; JTextField example = new JTextField("", 6); p.add(example, gbc); public static void addTextField (JPanel p, GridBagConstraints gbc, String str,

我目前正在学习如何在Java中使用Swing。在向JPanel添加JTextFields、JLabel或JButtons时,我通常使用以下4行代码:

gbc.gridx = 0;
gbc.gridy = 0;
JTextField example = new JTextField("", 6);
p.add(example, gbc);
public static void addTextField (JPanel p, GridBagConstraints gbc, String str, int x, int y, int len) {
gbc.gridx = x;
gbc.gridy = y;
JTextField tempTF = new JTextField(str, len);
p.add(tempTF, gbc);
}
ClassName.addTextField(p2, gbc, "", 1, 1, 6);
但是,我试图通过以下方法压缩我的代码:

gbc.gridx = 0;
gbc.gridy = 0;
JTextField example = new JTextField("", 6);
p.add(example, gbc);
public static void addTextField (JPanel p, GridBagConstraints gbc, String str, int x, int y, int len) {
gbc.gridx = x;
gbc.gridy = y;
JTextField tempTF = new JTextField(str, len);
p.add(tempTF, gbc);
}
ClassName.addTextField(p2, gbc, "", 1, 1, 6);
并在main方法中调用addTextField(),如下所示:

gbc.gridx = 0;
gbc.gridy = 0;
JTextField example = new JTextField("", 6);
p.add(example, gbc);
public static void addTextField (JPanel p, GridBagConstraints gbc, String str, int x, int y, int len) {
gbc.gridx = x;
gbc.gridy = y;
JTextField tempTF = new JTextField(str, len);
p.add(tempTF, gbc);
}
ClassName.addTextField(p2, gbc, "", 1, 1, 6);
我遇到的问题是如何检索JTextField中的文本。大概

String str = example.getText();

它正常工作,不再工作了

有没有办法解决这个问题

这是我在回答任何问题之前使用的完整代码:

/**
* This program creates two windows.
* Window #1 displays Hello World
* WIndow #2 prompts users to input information
*/

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

public class MessingWithSwing extends JFrame{

  //Main Method
  public static void main(String[] args) { 
    //makes the first window
    MessingWithSwing window1 = new MessingWithSwing("Window #1", 300, 300);
    //makes the second window with minimum dimensions
    MessingWithSwing window2 = new MessingWithSwing("Window #2", 450, 300, 300, 300);

    //GridBagConstraints allows the objects in each panel to be positioned in grid cordinates
    GridBagConstraints gbc = new GridBagConstraints();
    //sets the spaces between each grid position
    gbc.insets = new Insets(10, 10, 10, 10);

    //creates a JPanel that uses a grid layout
    JPanel p1 = new JPanel(new GridBagLayout());
    //adds the panel in the center of window1
    window1.add(p1, BorderLayout.CENTER);
    //sets the panel visible so it can correctly display the labels, textfields, and buttons
    p1.setVisible(false);

    //uses the method created below to add JLabels to p1
    MessingWithSwing.addLabel(p1, gbc, "Hello", 0, 0);
    MessingWithSwing.addLabel(p1, gbc, "World", 0, 1);

    p1.setVisible(true);

    //creates a second JPanel that also uses a grid layout
    JPanel p2 = new JPanel(new GridBagLayout());
    //adds the panel at the top of window2
    window2.add(p2, BorderLayout.NORTH);
    //sets the panel visible so it can correctly display the labels, textfields, and buttons
    p2.setVisible(false);

    //uses the method created below to add JLabels to p2
    MessingWithSwing.addLabel(p2, gbc, "Please Enter The Following", 0, 0);
    MessingWithSwing.addLabel(p2, gbc, "Name: ", 0, 1);
    MessingWithSwing.addLabel(p2, gbc, "Age: ", 0, 2);

    //uses the method created below to add JTextFields to p2
    MessingWithSwing.addTextField(p2, gbc, "", 1, 1, 6);
    MessingWithSwing.addTextField(p2, gbc, "<age>", 1, 2, 6);

    //uses the method created below to add a JButton to p2
    MessingWithSwing.addButton(p2, gbc, "Enter", 0, 3);

    p2.setVisible(true);

    /* Issue:
     * The someting like the line below would not work
     * How would you access the text inputted into each JTextField?
     */
//    String str = tempTF.getText();

  } //end of Main Method

  //first constructor makes a window that is completely resizable
  public MessingWithSwing(String title, int sizeX, int sizeY) {
    super(title);
    setSize(sizeX, sizeY);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
  }

  //second constructor makes a window that is resizable but has minimum dimensions
  public MessingWithSwing(String title, int sizeX, int sizeY, int minSizeX, int minSizeY) { 
    super(title);
    setSize(sizeX, sizeY);
    setMinimumSize(new Dimension(minSizeX, minSizeY));
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);
  }

  //This method adds a JLabel with an indicated text, at an indicated GridBagConstraints location, to an indicated JPanel
  public static void addLabel(JPanel p, GridBagConstraints gbc, String str, int x, int y) {
    gbc.gridx = x;
    gbc.gridy = y;
    JLabel tempLabel = new JLabel(str);
    p.add(tempLabel, gbc);
  }

  //This method adds a JTextField with an indicated length and text, at an indicated GridBagConstraints location, to an indicated JPanel
  public static void addTextField (JPanel p, GridBagConstraints gbc, String str, int x, int y, int len) {
    gbc.gridx = x;
    gbc.gridy = y;
    JTextField tempTF = new JTextField(str, len);
    p.add(tempTF, gbc);
  }

  //This method adds a JButton with an indicated text, at an indicated GridBagConstraints location, to an indicated JPanel
  public static void addButton (JPanel p, GridBagConstraints gbc, String str, int x, int y) {
    gbc.gridx = x;
    gbc.gridy = y;
    JButton tempB = new JButton(str);
    p.add(tempB, gbc);
  }

}
然后:

ArrayList tfList=new ArrayList();
添加(ClassName.addTextField(p1,gbc,text,0,0,8));
String str=tfList.get(0.getText();

如何在文本字段中获取文本完全取决于您何时何地获取文本

假设您希望随时检索文本,那么您可以使
addTextField
返回它添加的文本字段。这样,您就可以跟踪列表、数组甚至映射中的所有文本字段,只需对这些文本字段调用
getText


在另一种情况下,您可能只在用户按下文本字段中的enter键时才需要文本,然后您可以将侦听器绑定到文本字段。当事件发生时,您可以访问事件源,即文本字段,然后检索文本。

如何在文本字段中获取文本完全取决于您希望在何时何地获取文本

假设您希望随时检索文本,那么您可以使
addTextField
返回它添加的文本字段。这样,您就可以跟踪列表、数组甚至映射中的所有文本字段,只需对这些文本字段调用
getText


在另一种情况下,您可能只在用户按下文本字段中的enter键时才需要文本,然后您可以将侦听器绑定到文本字段。当事件发生时,您可以访问事件源,即文本字段,然后检索文本。

您可以
publicstaticvoidaddtextfield(JPanel p,GridBagConstraints gbc,String str,int x,int y,int len){
publicstaticvoidaddcomponent(JPanel p,GridBagConstraints gbc,JComponent component,int x,int y,int len){你能在调用addTextField方法的地方发布代码吗?@AndrewThompson我已经想到了,但是我想知道是否有一种方法可以不用两行就可以做到。这样,如果我需要添加8个jLabel和8个JTextFields,它只使用16行而不是32行。@paulk23当然。我添加了上面的代码。你可以uld使..
公共静态void addTextField(JPanel p,GridBagConstraints gbc,String str,int x,int y,int len){
改为
公共静态void addComponent(JPanel p,GridBagConstraints gbc,JComponent component,int x,int y,int len){
你能在调用addTextField方法的地方发布代码吗?@AndrewThompson我已经想到了这一点,但是我想知道是否有一种方法可以不用两行就可以做到。这样,如果我需要添加8个jLabel和8个JTextFields,它只会使用16行而不是32行。@paulk23当然。我添加了上面的代码。@Kequiang Li哇,我实际上没有想过将它保存在数组中。我喜欢它,因为添加JTextField是在线的。我以前也学过类似的东西,所以我会在上面尝试。谢谢!@javaCM是的,这样,你可以轻松地迭代所有文本字段。@Kequiang Li哇,我实际上没有想过将它保存在数组中。我喜欢这是因为添加JTextField是在线的。我以前也学过类似的东西,所以我将在上面尝试。谢谢!@javaCM是的,这样,你可以轻松地迭代所有的文本字段。