Jtextfield setText() 根本不起作用

Jtextfield setText() would not work at all

所以这就是我想要做的是将 absolutePath 放入 jtextfield 中,我进行了系统打印,它显示了路径但不会在 jtextfield 中设置文本。

向导中的操作事件(按钮)class:

  //buttons
  JButton openMapButton = new JButton("Load Map");
  ImageLoader imgload = new ImageLoader();
  openMapButton.addActionListener(new ActionListener(){
     public void actionPerformed(ActionEvent e){
        imgload.fileChooser();
     }
 });

向导中的 Jtextfield class:

      JTextField mapURLField = new JTextField(20);

ImageLoader class:

public class ImageLoader extends Wizard{

private JLabel label; 
JFileChooser chooser;
File file; 
private BufferedImage img;
Wizard wiz = new Wizard();
JTextField mapURLField;   


public void loadImg(){
}


public void fileChooser(){
 wiz.mapURLField = new JTextField();
      
  if(chooser == null){
  chooser = new JFileChooser(".");
}

int returnVal = chooser.showOpenDialog(null);

if(returnVal == JFileChooser.APPROVE_OPTION){
  wiz.mapURLField.setText(chooser.getSelectedFile().getAbsolutePath());
  System.out.println(chooser.getSelectedFile().getAbsolutePath());
  }else{
     wiz.mapURLField.setText("");
  }
  
  chooser.setSelectedFile(null);


 } 
}

您在 错误的 向导对象中设置了错误的 JTextField 状态。应该更改的文本字段是 displayed 向导 class 中显示的文本字段,而不是您在其上创建的 JTextField其他一些 class 中的位置,它位于您也在 ImageLoader 中创建的新创建的非显示向导 class 中。

这个:

public class ImageLoader extends Wizard{
    private JLabel label; 

    // ....        

    Wizard wiz = new Wizard();
    JTextField mapURLField; 

创建一个new Wizard 对象,但肯定不是 Wizard 对象当前正在显示,因此更改这个新创建且未显示的对象的状态对您没有帮助。

改为:

ImageLoader imgload = new ImageLoader();

至:

ImageLoader imgload = new ImageLoader(this);     

如果没有在 ActionListener 或其他匿名 class 中调用,因为这应该将显示的 Wizard 对象加载到 ImageLoader class。

并且在 ImageLoader 中执行:

private Wizard wiz; // a field to hold the displayed Wizard

public ImageLoader(Wizard wiz) {
    this.wiz = wiz; // set the field with the parameter passed in
    ....
}

然后在您的 ImageLoader class.

中调用现在由 wiz 持有的 *true Wizard 对象的方法

另外,去掉

wiz.mapURLField = new JTextField();

创建 new JTextField 毫无意义,它肯定不会显示在原始 Wizard 对象中。您想要更改显示的 JTextField 的状态。最好的方法是给 Wizard 一个 public 方法,让你可以这样做:

// in the Wizard class:

public void setMapUrlField(String text) {
    mapURLField.setText(text);
}

最后,扩展向导的 ImageLoader class:

public class ImageLoader extends Wizard {

可能没有按照您的想法去做,也可能不是您想要做的。


概念验证代码:

import java.io.File;
import javax.swing.*;

public class Wizard extends JPanel {
    private ImageLoader imgload = new ImageLoader(this);
    private JTextField mapURLField = new JTextField(30);
    private JButton openMapButton = new JButton("Load Map");
    private File file;
    
    public Wizard() {
        openMapButton.addActionListener(e -> {
            file = imgload.fileChooser();
        });
        
        mapURLField.setFocusable(false);
        add(mapURLField);
        add(openMapButton);
    }
    
    public void setMapUrlField(String text) {
        mapURLField.setText(text);
    } 
    
    public File getFile() {
        return file;
    }
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            Wizard wiz = new Wizard();
            
            JFrame frame = new JFrame("Wizard");
            frame.add(wiz);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        });
    }
}
class ImageLoader {

    private Wizard wiz;

    public ImageLoader(Wizard wizard) {
        this.wiz = wizard;
    }

    public File fileChooser() {
        File file = null;
        JFileChooser fileChooser = new JFileChooser();
        int retValue = fileChooser.showOpenDialog(wiz);
        if (retValue == JFileChooser.APPROVE_OPTION) {
            file = fileChooser.getSelectedFile();
            wiz.setMapUrlField(file.getAbsolutePath());
        } else {
            wiz.setMapUrlField("");
        }
        
        return file;
    }
    
}