Java 从文本字段获取信息以在其他类的文本区域中使用

Java 从文本字段获取信息以在其他类的文本区域中使用,java,swing,user-interface,jtextfield,jtextarea,Java,Swing,User Interface,Jtextfield,Jtextarea,我有一个类,其中有两个文本字段:“name”和“姓氏”。我需要有人为另一个类的文本区域键入的信息。到目前为止,我成功地编写了(Person类): 另一类现在: public class Greeting extends JPanel implements ActionListener { Person person = new Person(); String name = person.name; String surname = person.surname; public Gr

我有一个类,其中有两个文本字段:“name”和“姓氏”。我需要有人为另一个类的文本区域键入的信息。到目前为止,我成功地编写了(Person类):

另一类现在:

public class Greeting extends JPanel implements ActionListener {

Person person = new Person();   

String name = person.name;
String surname = person.surname;

public Greeting() {
    super(new BorderLayout());
    init();
}

public void init() {

    nextButton = new JButton("NEXT");
    nextButton.setActionCommand(next);      
    nextButton.addActionListener(this);     
    //nextButton.setMnemonic('rightArrow');     

    String q = "How are you today, "+name+" "+surname+"?";          

    JTextArea textArea = new JTextArea(q); 
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    textArea.setEditable(false);
    add(textArea, BorderLayout.NORTH);      

    JPanel btnPanel = new JPanel();     
    btnPanel.setLayout(new BoxLayout(btnPanel, BoxLayout.LINE_AXIS));
    btnPanel.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
    btnPanel.add(Box.createHorizontalGlue());                       
    btnPanel.add(nextButton);
        btnPanel.setAlignmentX(RIGHT_ALIGNMENT);
    add(btnPanel, BorderLayout.SOUTH);      

} // end init

public static void showNextWindow() {
    //cardLayout.next(this);
    System.out.println("go to the next window");
}

public void actionPerformed(ActionEvent e) {

}

public static void createAndShowGUI() {

    JFrame frame = new JFrame("How are you");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new Greeting());     
    frame.setSize(550, 450);
    frame.setResizable(false);
    //frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

public static void main(String[] args) {
    // Schedule a job for the event-dispatching thread:
    // creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}


但我在窗口看到的是:“你今天好吗,零零零零?”有没有新的眼睛来发现什么问题?谢谢

更好地使用getter方法:

(个人类别):

// public String name;
// public String surname;
// ...

public Person()
{
    // ...
    nameField = new JTextField();
    nameField.addActionListener(this);
    surnameField = new JTextField();
    surnameField.addActionListener(this);

    // and in public void actionPerformed(ActionEvent e) {
    // name = nameField.getText();
    // surname = surnameField.getText();

    // ...
}
private String getName(){return nameField.getText();}
private String getSurname(){return surnameField.getText();}
// ...
另一类:

Person person = new Person();
String name = person.getName();
String surname = person.getSurname();

String q = "How are you today, "+name+" "+surname+"?";
JTextArea textArea = new JTextArea(q);

一种方法是为值创建访问器。。因此,你应该:

String getName()
{
     nameField.getText();
}

在另一个类中,只需调用这些方法即可返回值


您应该将实例变量保留为私有变量,并且永远不要将它们公开(除非您有很好的理由)。请继续阅读

您从未向我们展示过您已经证明在文本输入到字段中之后以及字符串变量在其他地方使用之前调用了ActionListener。不管怎样,这是一个糟糕的设计

我会给这个类提供JTextFields公共getter方法,而不是公共变量,在getter方法中,我会提取对应JTextField中当前的文本。例如,类似于:

private JTextField nameField = new JTextField();
private JTextField surnameField = new JTextField();

public String getName() {
  return nameField.getText();
}

public String getSurname() {
  return surnameField.getText();
}

//... etc...
例如,以下是一个SSCCE,它演示了您的问题和解决方案:

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

public class InfoFromTextFields {
   private static void createAndShowUI() {
      JFrame frame = new JFrame("InfoFromTextFields");
      frame.getContentPane().add(new MainGui());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class NamePanel extends JPanel {
   private JTextField nameField = new JTextField(10);
   private JTextField surnameField = new JTextField(10);

   public NamePanel() {
      add(new JLabel("Name:"));
      add(nameField);
      add(Box.createHorizontalStrut(15));
      add(new JLabel("Surname:"));
      add(surnameField);
   }

   public String getNameText() {
      return nameField.getText();
   }

   public String getSurnameText() {
      return surnameField.getText();
   }
}

class MainGui extends JPanel {
   private JTextField nameField = new JTextField(10);
   private JTextField surnameField = new JTextField(10);

   public MainGui() {
      nameField.setEditable(false);
      surnameField.setEditable(false);

      add(new JLabel("Name:"));
      add(nameField);
      add(Box.createHorizontalStrut(15));
      add(new JLabel("Surname:"));
      add(surnameField);

      add(Box.createHorizontalStrut(15));
      add(new JButton(new AbstractAction("Get Names") {
         @Override
         public void actionPerformed(ActionEvent arg0) {
            NamePanel namePanel = new NamePanel();
            int result = JOptionPane.showConfirmDialog(nameField, namePanel,
                     "Get Names", JOptionPane.OK_CANCEL_OPTION);
            if (result == JOptionPane.OK_OPTION) {
               nameField.setText(namePanel.getNameText());
               surnameField.setText(namePanel.getSurnameText());
            }
         }
      }));
   }
}

据我所知,只有在按下“回车”键时,JTextFields(?)才会触发操作。请参见此处的示例:

如果在文本字段中输入文本并在启动另一个类/框架之前单击“回车”,是否有效

当然,更好的解决方案是getters,就像前面提到的气垫船:

public String getName(){
   return nameField.getText();
}

请发布一个。您的代码不够完整,任何人都无法了解发生了什么。你需要发布更多的
人物
和“其他”类。嗯,老实说,我认为这是很好的解释。这些类包含很多代码。。。我应该特别添加哪些内容?什么是不清楚的?Barler,你假设我们对你的程序设计了解很多,而你没有告诉我们。这是一个非常不完整的问题。最好是给我们展示一个小的可编译程序来演示这个问题,一个(查看链接)。@Barler:这是一个学习到的决定多少是太多,多少是不够的技巧。通过练习,你会做得更好。简单的事实是,您发布的代码根本无法说明问题所在——为什么变量为null。我在下面的回答中发布了一个SSCCE示例,演示了我的建议。不,即使作为getter,您也不想返回这些变量,因为如果JTextField中的文本发生了更改,但在调用getter时没有调用action listener会怎么样?与daMainBoss的回答中的问题相同。如果您有getter,为什么你的名字和姓氏字段仍然公开???@气垫船上全是鳗鱼谢谢:)
import java.awt.event.ActionEvent;
import javax.swing.*;

public class InfoFromTextFields {
   private static void createAndShowUI() {
      JFrame frame = new JFrame("InfoFromTextFields");
      frame.getContentPane().add(new MainGui());
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

class NamePanel extends JPanel {
   private JTextField nameField = new JTextField(10);
   private JTextField surnameField = new JTextField(10);

   public NamePanel() {
      add(new JLabel("Name:"));
      add(nameField);
      add(Box.createHorizontalStrut(15));
      add(new JLabel("Surname:"));
      add(surnameField);
   }

   public String getNameText() {
      return nameField.getText();
   }

   public String getSurnameText() {
      return surnameField.getText();
   }
}

class MainGui extends JPanel {
   private JTextField nameField = new JTextField(10);
   private JTextField surnameField = new JTextField(10);

   public MainGui() {
      nameField.setEditable(false);
      surnameField.setEditable(false);

      add(new JLabel("Name:"));
      add(nameField);
      add(Box.createHorizontalStrut(15));
      add(new JLabel("Surname:"));
      add(surnameField);

      add(Box.createHorizontalStrut(15));
      add(new JButton(new AbstractAction("Get Names") {
         @Override
         public void actionPerformed(ActionEvent arg0) {
            NamePanel namePanel = new NamePanel();
            int result = JOptionPane.showConfirmDialog(nameField, namePanel,
                     "Get Names", JOptionPane.OK_CANCEL_OPTION);
            if (result == JOptionPane.OK_OPTION) {
               nameField.setText(namePanel.getNameText());
               surnameField.setText(namePanel.getSurnameText());
            }
         }
      }));
   }
}
public String getName(){
   return nameField.getText();
}