Jtextfield setText() 根本不起作用

Posted

技术标签:

【中文标题】Jtextfield setText() 根本不起作用【英文标题】:Jtextfield setText() would not work at all 【发布时间】:2021-12-27 04:09:27 【问题描述】:

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

向导类中的动作事件(按钮):

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

Wizard 类中的 Jtextfield:

      JTextField mapURLField = new JTextField(20);

ImageLoader 类:

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);


  

【问题讨论】:

所以你是说System.out.println(chooser.getSelectedFile().getAbsolutePath()); 有效但wiz.mapURLField.setText(chooser.getSelectedFile().getAbsolutePath()); 无效?如果是这种情况,使用任何值设置文本字段是否有效? 这个,Wizard wiz = new Wizard(); 可能是你的问题。您正在创建一个 new 向导对象,但它与显示的对象相同吗?没有像样的minimal reproducible example,真的很难说。我还想知道您是否正确使用了继承,ImageLoader extends Wizard 如果ImageLoader extends Wizard 那么你为什么要实例化new Wizard() - 哎呀重复@HovercraftFullOfEels 评论 然后是wiz.mapURLField = new JTextField(); - 这肯定是不是显示的JTextField。恐怕您在整个这段代码中都在滥用引用。 【参考方案1】:

您在错误 Wizard 对象内设置了错误 JTextField 的状态。应该更改的文本字段是 displayed Wizard 类中显示的文本字段,而不是您在某个其他类中当场创建的 JTextField您也在 ImageLoader 中创建的新创建的非显示向导类。

这个:

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 或其他匿名类中调用,因为这应该将显示的 Wizard 对象加载到 ImageLoader 类中。

在 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 类中调用 *true Wizard 对象的方法,现在由 wiz 持有。

另外,摆脱

wiz.mapURLField = new JTextField();

创建一个 JTextField 是没有意义的,它肯定不会显示在原始Wizard 对象中。您想要更改显示的 JTextField 的状态。最好的方法是为 Wizard 提供一个公共方法,让您可以这样做:

// in the Wizard class:

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


最后,ImageLoader 扩展了 Wizard 类:

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;
    
    

【讨论】:

感谢您的清晰解释,它帮助我更清楚地理解。它有效,但有一个小问题,我得到java.lang.NullPointerException: Cannot invoke "javax.swing.JTextField.setText(String)" because "this.mapURLField" 为空,但是当我调试它时,它显然不是空的,因为它显示了 url?我认为扩展会给类访问方法等等,但我错了。 没关系,显然这是因为我有 2 个“新 jtextfield”,一个用于命名,一个用于创建。这样做的正确方法是什么? (比如private JTextField siteNameField, aisleNumField, laneNumField;JTextField siteNameField = new JTextField(5); .....) @Zyaan:您将需要与外部对象交互的 Swing 组件声明为类的私有字段,并使用公共方法来允许受控交互,正如我在此处的代码中所示。如果这不能回答您在上面提出的问题,那么我不确定您在问什么。 很抱歉,我没有问对,但我的意思是,无需为每个 jtextfield 变量执行 "JTextfields jt = new JTextField(20); 即可声明多个 jtextfields 的最简单方法是什么,而不是一个声明和另一个一个像我一样在体内创建它?我还想再次感谢您帮助我解决我的问题:)

以上是关于Jtextfield setText() 根本不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Swing - Thread.sleep() 停止 JTextField.setText() 工作[重复]

有没有办法在不触发 DocumentListener 的 removeupdate() 的情况下调用 JTextField.setText()?

JTextField 和 JTextPane 之间的根本区别是啥?

java如何获取输入框内容并赋值

创建后如何在 JTextField 中设置新文本?

尝试仅允许将数字输入JTextField,将非数字设置为0