微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JTextField getText() 工作不正常

如何解决JTextField getText() 工作不正常

我在实现 getText() 方法时遇到问题。出于某种原因,当我在文本框中按 Enter 键时,输入不会被传输到名为 playerOneName 的字符串中。我曾尝试使用动作侦听器和其他方法,但没有成功,任何建议将不胜感激。

//imports
import java.lang.*;
import java.util.*;
import java.util.List;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;

public class mainClass extends JPanel implements ActionListener {
    
    //constant variables to use
    private static JTextField textField;
    

    
    private static final long serialVersionUID = 1L;
    
    public mainClass() {
        
    }
    
    public void paintComponent(Graphics g) {
        
        //set background color to white
        g.setColor(Color.white);
        g.fillRect(0,getWidth(),getHeight());
            
        }
        
        
      }

    public static void initializeBoard() {
    }
    public static void main(String[] args) {
        // title of frame
        JFrame frame = new JFrame("Risk");
        textField = new JTextField(20);
        frame.add(textField,BorderLayout.soUTH);
        String playerOneName= textField.getText();
        JLabel Name = new JLabel("");
        Name.setText(playerOneName);
        frame.add(Name,BorderLayout.EAST);

        JLabel welcome = new JLabel("");
        welcome.setText("Please Enter name for Player 2 in the text Box at the bottom");
        frame.add(welcome,BorderLayout.norTH);
        // make sure it closes correctly
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        
        //frame size in pixels
        final int FRAME_WIDTH = 1000;    
        final int FRAME_HEIGHT = 700;
        frame.setSize(FRAME_WIDTH,FRAME_HEIGHT);
        
        // makes sure the frame is visible
        frame.setVisible(true);
        mainClass main = new mainClass();
        frame.add(main);
        
        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        
    }


}

解决方法

我猜您想在将 playerOneName 写入 textField 后,在每次按 Enter 键时都想获取它。问题是您没有向组件添加侦听器,因此您提供的代码中没有发生任何事情

在这里,您将添加侦听器(例如,按下 Enter 后会触发)并打印它。您现在可以获取并使用该值。

...

  frame.add(textField,BorderLayout.SOUTH);
  textField.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                System.out.println(textField.getText());
            }
        });

...

,

您的代码的问题在于您将“playerOneName”的值设置为

Name.setText(playerOneName);

这是在您的框架变得可见以供输入之前。因此,您不能期望对 JTextField 的更改自动推送到过去已经执行过的代码,即 Name.setText(playerOneName)。您的文本字段不会自动绑定到 playerOneName 变量。这意味着每次更新 JTextField 中的文本时,都不会告诉 playerOneName 变量进行相应更改。

在您的情况下,您希望在按“Enter”键时发生这种情况。您这样做的方法如下:

  1. 在此处将事件侦听器附加到您的 GUI 元素,即 JTextField
  2. 在事件侦听器中,您将更新相关变量

最简单的方法是添加一个 ActionListener 来检测“Enter”被按下并更新 playerOneName。因此,只需在您的 main 方法中(在最后)添加以下代码:

textField.addActionListener((e) -> {
    Name.setText(textField.getText());
});

实际上,您可以在初始化 textField 和 name 变量后的任何地方将此代码添加到 main 方法中。

但是,您还可以进行许多其他改进。例如,Java 使用驼峰命名法来命名变量。重写代码的一种快速方法是:

public class MainClassX extends JPanel {

    public void paintComponent(Graphics g) {
        g.setColor(Color.white);
        g.fillRect(0,getWidth(),getHeight());

    }
    
    public static void main(String[] args) {
        final int FRAME_WIDTH = 1000;
        final int FRAME_HEIGHT = 700;
        JFrame frame = new JFrame("Risk");
        JTextField textField = new JTextField(20);
        JLabel name = new JLabel("");
        JLabel welcome = new JLabel("");
        
        MainClassX main = new MainClassX();
        welcome.setText("Please Enter name for Player 2 in the text box at the bottom");
    
        frame.add(name,BorderLayout.EAST);
        frame.add(textField,BorderLayout.SOUTH);
        frame.add(welcome,BorderLayout.NORTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(FRAME_WIDTH,FRAME_HEIGHT);
        frame.setVisible(true);
        frame.add(main);
        
        textField.addActionListener((e) -> {
            name.setText(textField.getText());
        });
    }
}

,

您需要将 KeyListener 添加到您的 textField,因为现在您可以在创建 JFrame 时从 TextField 获取文本。因此,您需要在用户甚至有机会输入用户名之后从 textField 获取文本。

textField.addKeyListener(new KeyListener() {
    @Override
    public void keyTyped(KeyEvent e) {}
    
    @Override
    public void keyReleased(KeyEvent e) {}
    
    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
            name.setText(textField.getText());
        }
    }
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。