Search code examples
javaswingjpaneljtextfield

Retrieving text from a JTextField when using a method to add the JTextField


I am currently learning how to use Swing in Java. When adding JTextFields, JLabels, or JButtons to a JPanel I usually do so in 4 lines such as this:

gbc.gridx = 0;
gbc.gridy = 0;
JTextField example = new JTextField("", 6);
p.add(example, gbc);

However I am trying to condense my code by making a method such as this:

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

and calling addTextField() in the main method such as this:

ClassName.addTextField(p2, gbc, "", 1, 1, 6);

The issue that I have is how to retrieve the text in the JTextField. Something like,

String str = example.getText();

or

String str2 = tempTF.getText();

which normally works, doesn't work anymore.

Any ideas on how I could solve this?

This is the full code I am working with before any answers:

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

}

So if I understand Kequiang Li correctly it would look something like:

public static JTextField 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);
    return tempTF;
  }

Then:

ArrayList<JTextField> tfList = new ArrayList<JTextField>();
tfList.add(ClassName.addTextField(p1,gbc,text,0,0,8));
String str = tfList.get(0).getText();

Solution

  • How to get the text inside your text fields totally depends on where and when you want to get the text.

    Let's say you want to retrieve the text whenever you want, then you can make your addTextField returns the text field it has added. This way, you can keep track of all the text fields in a list, an array, or even a map, and just call getText on these text fields.

    In another situation, you might want the text only when user presses the enter key in the text field, then you can bind listener to the text field. When the event occurs, you can have access to the source of the event, which is the text field and then retrieve the text.