问题描述
我在实现 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”键时发生这种情况。您这样做的方法如下:
- 在此处将事件侦听器附加到您的 GUI 元素,即 JTextField
- 在事件侦听器中,您将更新相关变量
最简单的方法是添加一个 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());
}
}
});