Java 如何从JTextField获取用户输入?

Java 如何从JTextField获取用户输入?,java,swing,jtextfield,Java,Swing,Jtextfield,我正在尝试一个非常简单的表单,该表单旨在将用户输入带入JTextField,并通过弹出对话框显示相同的输入 我可以使用setText()将JTextField硬编码为具有预设编号。如果我这样做,我的程序就会完美无瑕 但是,当我将字段留空并尝试getText()在弹出对话框中显示文本时,我要么得到一个空的弹出框,要么得到一个“空字符串”异常(我试图将字符串解析为双精度) 任何帮助都将不胜感激。我正在使用KeyListener或KeyEvent进行研究,但我对其了解不够。您正在b2的Action

我正在尝试一个非常简单的表单,该表单旨在将用户输入带入JTextField,并通过弹出对话框显示相同的输入

我可以使用setText()将JTextField硬编码为具有预设编号。如果我这样做,我的程序就会完美无瑕

但是,当我将字段留空并尝试getText()在弹出对话框中显示文本时,我要么得到一个空的弹出框,要么得到一个“空字符串”异常(我试图将字符串解析为双精度)

任何帮助都将不胜感激。我正在使用KeyListener或KeyEvent进行研究,但我对其了解不够。

您正在b2的ActionListener中创建一个“shadow”ButtonFrame变量。是,bf变量指的是ButtonFrame对象,该对象与显示的ButtonFrame对象属于同一类,但它指的是一个完全不同的非可视化对象。解决方案的关键是从实际显示的ButtonFrame对象中获取文本,这可以通过
ButtonFrame从内部类中获取。此结构:

     b2.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
           //!! ButtonFrame bf = new ButtonFrame();
           if ("calculate".equals(e.getActionCommand())) {

              //!! note use of ButtonFrame.this:
              JOptionPane.showMessageDialog(frame, ButtonFrame.this.loanAmt.getText());
           }
        }

     });

接下来考虑使用公共吸气剂,而不是直接访问JTeFieldE等字段。这减少了代码产生副作用的可能性,例如无意中更改JTextField对象的属性

例如(用//!!注释表示的更改):


您访问loanAmt的唯一方法是通过按钮面板本身。因为你在这个按钮上添加了loanAmt,对吗

因此,如果您想要访问loanAmt。您必须获取此按钮面板上的所有组件。这是我的psudeo代码,说明如何从ButtonPanel类访问您的loanAmt

b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        ButtonFrame bf = new ButtonFrame();
        if("calculate".equals(e.getActionCommand())) {
            // Get all component 
            java.awt.Component[] componentList = this.getComponents();
            JTextField txtField;
            String value;
            for (int i = 0; i < componentList.length; i++) {
                if (componentList[i].getClass().getName().equals("javax.swing.JTextField")) {
                    txtField = (JTextField) componentList[i];
                    value = textField.getText();
                }
            }
            if (value != null) JOptionPane.showMessageDialog(frame, value);
        }
    }
});
b2.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
ButtonFrame bf=新ButtonFrame();
如果(“计算“.equals(例如getActionCommand())){
//获取所有组件
java.awt.Component[]componentList=this.getComponents();
JTextField-txtField;
字符串值;
for(int i=0;i
这太有帮助了!非常感谢您抽出时间来看这本书!不客气!祝您在这个项目和Java学习中好运@菲尼克斯:这里的关键是所有的参考资料。您需要对实际显示对象的引用,而不是任何ButtonFrame对象。理解引用和引用变量越多,就越能理解Java和OOPs。这很有意义。我把头撞在墙上想弄明白。因此,在创建3个新文本字段时,我需要引用每个显示的对象(ButtonFrame1.this--ButtonFrame2.this--ButtonFrame3.this),以便对它们进行任何操作。我试图做一个简单的摊销calculator@Phoenix字体不,我猜不是。如果您有三个JTextFields,并且它们都保存在同一个类ButtonFrame中,那么您只需要引用一个ButtonFrame对象ButtonFrame.this。然后,您将需要三个访问器方法来从三个JTextField获取文本,或者需要一个访问器方法,该方法采用一个参数,该参数以某种方式为方法键入要返回的JTextField文本。如果JTextField嵌套在其他jpanel中的jpanel中,该怎么办?如果以后GUI的布局发生变化呢?如果GUI有多个JTextFields呢?不,这是一种非常脆弱的提取信息的方法,很容易被破坏,并且不能很好地扩展。最好使用公共访问器方法。如果JTextField位于嵌套面板中,则描述了更好但更高级的方法,这将是一场噩梦。我同意你的解决方案:)我编辑了你的帖子(添加了一个空格),这样我就可以取消我的否决票了。我建议你阅读我上面评论中的链接,因为它们简直令人惊叹,让我大开眼界。他们把我的建议放在我的回答中,使我感到羞愧。
import java.awt.*;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.awt.event.ActionEvent;

public class ButtonTest {
   public static void main(String[] args) {
      ButtonFrame frame = new ButtonFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}

class ButtonFrame extends JFrame {

   private JTextField loanAmt; // !! Make field private

   @SuppressWarnings("LeakingThisInConstructor")
   public ButtonFrame() {

      setTitle("SunStream Loan Calculator v2.0");
      setSize(900, 900);
      ButtonPanel panel = new ButtonPanel();
      panel.add(new JLabel("Enter your loan amount:"));
      loanAmt = new JTextField(40);
      panel.add(loanAmt);

      add(panel, BorderLayout.CENTER);
   }

   // !! create a public method to get JTextField's text
   // !! without exposing the JTextField itself.
   public String getLoanAmtText() {
      return loanAmt.getText();
   }

   class ButtonPanel extends JPanel implements ActionListener {
      private Component frame;

      public ButtonPanel() {

         final JButton b2 = new JButton("Calculate");
         add(b2, BorderLayout.SOUTH);
         b2.setActionCommand("calculate");
         b2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
               // !! ButtonFrame bf = new ButtonFrame();
               if ("calculate".equals(e.getActionCommand())) {

                  //!! call public method on ButtonFrame object
                  JOptionPane.showMessageDialog(frame,
                        ButtonFrame.this.getLoanAmtText());
               }
            }

         });

      }

      @Override
      public void actionPerformed(ActionEvent ae) {
         throw new UnsupportedOperationException("Not supported yet.");
      }

   }
}
b2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        ButtonFrame bf = new ButtonFrame();
        if("calculate".equals(e.getActionCommand())) {
            // Get all component 
            java.awt.Component[] componentList = this.getComponents();
            JTextField txtField;
            String value;
            for (int i = 0; i < componentList.length; i++) {
                if (componentList[i].getClass().getName().equals("javax.swing.JTextField")) {
                    txtField = (JTextField) componentList[i];
                    value = textField.getText();
                }
            }
            if (value != null) JOptionPane.showMessageDialog(frame, value);
        }
    }
});