Java Swing开发中JTextField调用setText()无法设置文本问题咨询
问题原因
- 操作的不是当前显示的Wizard实例:ImageLoader内部自行实例化了
Wizard wiz = new Wizard(),这个新实例和用户实际看到的运行中的Wizard窗口是完全独立的两个对象,修改新实例的组件属性不会同步到界面。 - 错误替换了JTextField实例:
fileChooser方法中执行了wiz.mapURLField = new JTextField(),直接把原界面上已经渲染的文本框替换成了一个未加入任何容器的新文本框,调用新文本框的setText自然不会在界面展示效果。 - 冗余的继承关系:ImageLoader继承Wizard属于错误设计,没有用到继承特性的同时还产生了多余的父类属性实例,进一步混淆了实例对应关系。
修复方案
- 改造ImageLoader类,移除Wizard继承关系,删除内部自行创建的Wizard实例,通过构造函数接收界面上的JTextField对象直接操作:
public class ImageLoader { private JLabel label; JFileChooser chooser; File file; private BufferedImage img; // 存储外部传入的界面文本框实例 private JTextField mapURLField; // 构造方法接收需要操作的文本框 public ImageLoader(JTextField mapURLField) { this.mapURLField = mapURLField; } public void loadImg(){ } public void fileChooser(){ if(chooser == null){ chooser = new JFileChooser("."); } int returnVal = chooser.showOpenDialog(null); if(returnVal == JFileChooser.APPROVE_OPTION){ mapURLField.setText(chooser.getSelectedFile().getAbsolutePath()); System.out.println(chooser.getSelectedFile().getAbsolutePath()); }else{ mapURLField.setText(""); } chooser.setSelectedFile(null); } }
- 修改Wizard类中ImageLoader的实例化逻辑,将当前界面的mapURLField传入构造函数:
// 按钮逻辑修改 JButton openMapButton = new JButton("Load Map"); // 实例化时传入当前界面的文本框实例 ImageLoader imgload = new ImageLoader(mapURLField); openMapButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ imgload.fileChooser(); } });
- 确认Wizard类中的mapURLField为类成员变量:如果原mapURLField是定义在方法内的局部变量,需要提升为类的成员变量,否则实例化ImageLoader时无法获取到该实例。
内容的提问来源于stack exchange,提问作者Zyaan
相关产品推荐
相关产品推荐

