我在实现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) {
}
}
我猜你想要得到的playerOneName每当你已经在textField中写入后点击进入。问题是您没有向组件添加侦听器,因此在您提供的
代码中没有发生任何事情。在这里,您将添加侦听器(例如,它将在按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变量之后的任何地方添加此代码。
然而,你还可以做很多其他的改进。例如,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());
});
}
}
您需要将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());
}
}
});