如何解决我在文本字段中输入到另一个文本字段的第一个数字未显示
我想在 jTextField1 中输入数字并将其显示在 jTextField2 中,因为我在 jTextField1 中输入它,但是我在 jTextField1 中输入的第一个数字不会显示在 jTextField2 中,除非我输入另一个数字,然后我输入的最后一个数字不显示。
输出结果如下:
jTextField1 = 1 jTextField2 = (blank)
jTextField1 = 12 jTextField2 = 1
jTextField1 = 123 jTextField2 = 12
jTextField1 = 1234 jTextField2 = 123
我用过这个:
private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
String jj = jTextField1.getText();
int len = jj.length();
char jw = evt.getKeyChar();
if (Character.isDigit(jw) || (jw==KeyEvent.VK_BACKSPACE) || (jw==KeyEvent.VK_DELETE))
jTextField1.setEditable(true);
else
jTextField1.setEditable(false);
if (evt.getKeyChar()>='0' && evt.getKeyChar()<='9')
{
if (len<10)
jTextField1.setEditable(true);
else
jTextField1.setEditable(false);
}
jTextField2.setText(jTextField1.getText());
}
解决方法
如评论中所述,此处可能发生的情况(您仍应提供 minimal reproducible example)是您将 KeyListener
与 keyPressed
结合使用,从而设置文本jTextField2
通过从 jTextField1
检索文本。但问题是,在处理您的 keyPressed
事件时,jTextField1
的实际内容尚未完全更新。因此,您正在通过 getText()
检索“旧文本”。
因此省略 KeyListener
并将 DocumentListener
添加到您要从中检索文本的 JTextField
中。这将起作用,因为在您的 JTextField
中的文本更新后调用此侦听器,因此 getText()
将检索正确的文本。可以在 Oracle 教程 How to Write a Document Listener 中找到有关 DocumentListener 的更多信息。
(使用 keyReleased
的 KeyListener
方法似乎也是一种替代解决方案,但我发现这在测试时“滞后”。)
工作示例:
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> buildGui());
}
private static void buildGui() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
JTextField textField1 = new JTextField(10);
JTextField textField2 = new JTextField(10);
JLabel label1 = new JLabel("TextField 1:");
JLabel label2 = new JLabel("TextField 2:");
GridLayout layout = new GridLayout(2,2);
panel.setLayout(layout);
frame.add(panel);
panel.add(label1);
panel.add(textField1);
panel.add(label2);
panel.add(textField2);
// document listener for textField1
textField1.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
modifiedDocument(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
modifiedDocument(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
modifiedDocument(e);
}
public void modifiedDocument(DocumentEvent e) {
textField2.setText(textField1.getText());
}
});
frame.pack();
frame.setVisible(true);
}
结果:
,我为您编写了一个简单的 GUI 示例。请注意,布局并不理想:)
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class ExampleGui {
private JFrame mainFrame = new JFrame();
private JTextField nameTextField = new JTextField();
private JTextField copyOfNameTextField = new JTextField();
private JFrame buildFrame(){
mainFrame.setSize(500,500);
nameTextField.setSize(100,100);
copyOfNameTextField.setSize(100,100);
mainFrame.getContentPane().add(BorderLayout.NORTH,nameTextField);
mainFrame.getContentPane().add(BorderLayout.SOUTH,copyOfNameTextField);
nameTextField.addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
copyOfNameTextField.setText(nameTextField.getText());
}
});
return mainFrame;
}
public static void main(String[] args) {
ExampleGui exampleGui = new ExampleGui();
exampleGui.buildFrame().setVisible(true);
}
}
您构建 gui 组件的方法将是您添加 keyListener 的地方。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。