打印 JTextField 的内容
Printing contents of JTextField
我制作了一个提交按钮,但只有在该字段中有文本时才会将其设置为启用。如果字段中没有文本,提交按钮将被禁用。
但是,当我输入 a 时,提交按钮不会变为启用状态,它需要我输入另一个字符才能启用。我不得不再次按下删除按钮,即使我删除了框中的所有字符以禁用按钮。
我不明白为什么会这样,我输入了一个打印语句,看看我输入字符时会发生什么。我注意到它会打印出我在最后一次按键之前输入的内容。
public void keyPressed(KeyEvent e) {
System.out.println(inputField.getText()); // test input
if(inputField.getText().trim().length() == 0)
submit.setEnabled(false);
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
if(inputField.getText().trim().length() == 0)
JOptionPane.showMessageDialog(this, "Invalid input.", "Error", JOptionPane.ERROR_MESSAGE);
else
displayMessage();
return;
}
if(inputField.getText().trim().length() > 0) {
submit.setEnabled(true);
}
}
使用 keyTyped
代替 keyPressed
。
使用 keyReleased
代替 keyPressed
和 keyTyped
。看起来事件在按下键时触发,但在更新字段之前触发。使用 keyTyped
,它适用于删除当前字段中的字符,但您仍然需要输入 2 个字符才能让您的按钮再次工作。
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class TextField extends JFrame {
JTextArea inputField;
JButton submit;
public TextField()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
inputField = new JTextArea("hi");
submit = new JButton("Submit");
inputField.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent arg0) {
//func(arg0);
}
@Override
public void keyReleased(KeyEvent arg0) {
func(arg0);
}
@Override
public void keyTyped(KeyEvent arg0) {
//func(arg0);
}
});
this.setLayout(new GridLayout(0,1));
this.add(inputField);
this.add(submit);
this.pack();
this.setVisible(true);
}
void func(KeyEvent arg0)
{
System.out.println(inputField.getText() + "length: " + inputField.getText().trim().length()); // test input
if(inputField.getText().trim().length() == 0)
submit.setEnabled(false);
if(arg0.getKeyCode() == KeyEvent.VK_ENTER) {
if(inputField.getText().trim().length() == 0)
System.out.println("error");
else
System.out.println("success");
return;
}
if(inputField.getText().trim().length() > 0) {
submit.setEnabled(true);
}
}
public static void main(String [] args)
{
new TextField();
}
}
我制作了一个提交按钮,但只有在该字段中有文本时才会将其设置为启用。如果字段中没有文本,提交按钮将被禁用。 但是,当我输入 a 时,提交按钮不会变为启用状态,它需要我输入另一个字符才能启用。我不得不再次按下删除按钮,即使我删除了框中的所有字符以禁用按钮。
我不明白为什么会这样,我输入了一个打印语句,看看我输入字符时会发生什么。我注意到它会打印出我在最后一次按键之前输入的内容。
public void keyPressed(KeyEvent e) {
System.out.println(inputField.getText()); // test input
if(inputField.getText().trim().length() == 0)
submit.setEnabled(false);
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
if(inputField.getText().trim().length() == 0)
JOptionPane.showMessageDialog(this, "Invalid input.", "Error", JOptionPane.ERROR_MESSAGE);
else
displayMessage();
return;
}
if(inputField.getText().trim().length() > 0) {
submit.setEnabled(true);
}
}
使用 keyTyped
代替 keyPressed
。
使用 keyReleased
代替 keyPressed
和 keyTyped
。看起来事件在按下键时触发,但在更新字段之前触发。使用 keyTyped
,它适用于删除当前字段中的字符,但您仍然需要输入 2 个字符才能让您的按钮再次工作。
import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
public class TextField extends JFrame {
JTextArea inputField;
JButton submit;
public TextField()
{
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
inputField = new JTextArea("hi");
submit = new JButton("Submit");
inputField.addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent arg0) {
//func(arg0);
}
@Override
public void keyReleased(KeyEvent arg0) {
func(arg0);
}
@Override
public void keyTyped(KeyEvent arg0) {
//func(arg0);
}
});
this.setLayout(new GridLayout(0,1));
this.add(inputField);
this.add(submit);
this.pack();
this.setVisible(true);
}
void func(KeyEvent arg0)
{
System.out.println(inputField.getText() + "length: " + inputField.getText().trim().length()); // test input
if(inputField.getText().trim().length() == 0)
submit.setEnabled(false);
if(arg0.getKeyCode() == KeyEvent.VK_ENTER) {
if(inputField.getText().trim().length() == 0)
System.out.println("error");
else
System.out.println("success");
return;
}
if(inputField.getText().trim().length() > 0) {
submit.setEnabled(true);
}
}
public static void main(String [] args)
{
new TextField();
}
}