【问题标题】:Printing JTextField gives out a blank on console打印 JTextField 在控制台上给出一个空白
【发布时间】:2021-08-08 19:04:09
【问题描述】:

我是 Java 新手,刚刚尝试了 Java 的 swing,我尝试制作一个登录表单,将 JTextField 的内容打印到控制台,但是当我尝试时控制台没有显示任何内容。

这是我的代码:


import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;

public class JavaTextField {

    private JFrame frame;
    private JTextField text1;
    private JTextField text2;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    JavaTextField window = new JavaTextField();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public JavaTextField() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        
        text1 = new JTextField();
        text1.setBounds(114, 38, 122, 40);
        frame.getContentPane().add(text1);
        text1.setColumns(10);
        String majorText = text1.getText();
        
        
        text2 = new JTextField();
        text2.setBounds(114, 117, 86, 20);
        frame.getContentPane().add(text2);
        text2.setColumns(10);
        String minorText = text2.getText();
        
        JButton btnButton = new JButton("Button");
        btnButton.setBounds(132, 192, 159, 40);
        frame.getContentPane().add(btnButton);
        btnButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println(majorText);
                System.out.println(minorText);
            }
            }
    );
}
    }

如果有人能指出我正确的方向,我很高兴,因为我还没有在互联网上看到解决这个问题的方法。

【问题讨论】:

    标签: java swing java-8 jtextfield


    【解决方案1】:

    您的代码需要做一些改进:

    1. 避免使用null-layoutsetBounds(...),请参阅why should you avoid itgraphic example 以及使用layout managers 修复它的建议

    2. 您的majorText 在您单击按钮之前获取文本,到那时它是空的并且永远不会更新它,您需要在按钮单击时获取文本,所以移动这一行:

      String majorText = text1.getText();
      

      在您的actionListener 中,minorText 也是如此

    如果您使用 Java 8 标记您的问题,那么您可以使用 Java 8 lambdas 重写您的侦听器

    btnButton.addActionListener(e -> {
        String majorText = text1.getText();
        String minorText = text1.getText();
        System.out.println(majorText);
        System.out.println(minorText);
    }
    

    【讨论】:

      【解决方案2】:

      这里的问题是,您在错误的时间从JTextFields 检索内容。目前,您在初始化组件时调用getText()。当然getText()返回的内容会是一个空的String

      因此,要解决逻辑中的问题,您实际上应该在按下 JButton 后才从 JTextFields 中检索 majorTextminorText。因为在那个时间点,当您按下按钮时,您的文本字段的内容应该是正确的。为此,请将文本检索移动到ActionListener

      更新后的ActionListener 应如下所示:

      btnButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
              String majorText = text1.getText();
              String minorText = text2.getText();
              System.out.println(majorText);
              System.out.println(minorText);
          }
      }
      

      或者简单地说:

      btnButton.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
              System.out.println(text1.getText());
              System.out.println(text2.getText());
          }
      }
      

      旁注(正如另一个答案所提到的):

      强烈建议不要使用null 布局,因为它是不必要的错误的常见来源。查看可用的不同LayoutManagers 以及如何以及何时使用它们。

      【讨论】:

        猜你喜欢
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 2012-10-13
        • 2013-06-15
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        相关资源
        最近更新 更多