Swing中JTextField取值异常问题及文本修改显示功能实现咨询
问题分析与解决方案
首先,你遇到的NullPointerException是因为局部变量覆盖了类成员变量导致的。在CaesarFrame的构造函数里,你重新声明了tf1、tf2等变量(比如JTextField tf1=new JTextField("",20);),这会让类的成员变量tf1始终处于未初始化的null状态,当ActionListener里调用tf1.getText()时自然会抛出异常。
修复核心问题
修改构造函数,去掉局部变量的类型声明,直接给类成员变量赋值:
public CaesarFrame() { JFrame frame=new JFrame("Swinglab"); frame.setPreferredSize(new Dimension(400,110)); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setResizable(false); String[] characters=new String[26]; for(int i=65;i<91;i++) characters[i-65]=String.valueOf((char)i); // 去掉前面的类型声明,直接使用类成员变量赋值 box = new JComboBox(characters); tf1=new JTextField("",20); tf2=new JTextField("",20); jb=new JButton("Code!"); ActionListener listen=new OkButtonActionListener(); jb.addActionListener(listen); label= new JLabel("Output: "); j1=new JPanel(); j2=new JPanel(); j1.add(box); j1.add(tf1); j1.add(jb); j2.add(label); j2.add(tf2); tf2.setEditable(false); frame.add(j1,BorderLayout.NORTH); frame.add(j2,BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); }
关于监听器的问题
当前通过按钮的ActionListener已经能实现「输入后点击按钮显示修改文本」的需求,不需要额外给tf1添加监听器。
如果想要实现「实时输入实时更新输出」的效果(无需点击按钮),可以给tf1的文档添加DocumentListener,示例代码如下:
tf1.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { updateOutput(); } @Override public void removeUpdate(DocumentEvent e) { updateOutput(); } @Override public void changedUpdate(DocumentEvent e) { updateOutput(); } private void updateOutput() { String input = tf1.getText(); caesarCode c = new caesarCode(input); tf2.setText(c.get()); } });
或者如果只想在用户按下回车键时更新,可以给tf1添加ActionListener:
tf1.addActionListener(e -> { String input = tf1.getText(); caesarCode c = new caesarCode(input); tf2.setText(c.get()); });
内容的提问来源于stack exchange,提问作者Makkador
相关产品推荐
相关产品推荐

