【问题标题】:JTextField getText() not working correctlyJTextField getText() 无法正常工作
【发布时间】:2021-05-04 07:27:39
【问题描述】:

我在实现 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, 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) {
        
    }


}

【问题讨论】:

  • 不要重写paintComponent来改变面板的背景颜色。相反,您只需使用:main.setBackground( Color.WHITE );

标签: java swing textfield


【解决方案1】:

您的代码的问题是您将“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, 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());
        });
    }
}

【讨论】:

    【解决方案2】:

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

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

    ...

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

    ...

    【讨论】:

      【解决方案3】:

      您需要将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());
              }
          }
      });
      

      【讨论】:

      • (1-)。不要使用 KeyListener。 JTextField 旨在使用 ActionListener 来处理 Enter 键。
      猜你喜欢
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2012-09-24
      • 1970-01-01
      相关资源
      最近更新 更多