这段代码出了什么问题?

时间:2009-08-06 14:22:30

标签: java swing nullpointerexception

我写了这段代码:

public class FileViewer extends JPanel implements ActionListener {

/**
 * 
 */
private static final long serialVersionUID = 1L;

JFileChooser chooser;

FileNameExtensionFilter filter = null;

JEditorPane pane = null;

JTextField text = null;

JButton button;

JTextArea o = null;

URL url;

public FileViewer(JTextArea o) {
    this.o = o;
    setLayout(new FlowLayout(FlowLayout.RIGHT));
    JTextField text = new JTextField("file...", 31);
    text.setColumns(45);
    text.revalidate();
    text.setEditable(true);

    button = new JButton("Browse");
    add(text);
    add(button);
    filter = new FileNameExtensionFilter("html", "html");
    chooser = new JFileChooser();
    chooser.addChoosableFileFilter(filter);

    button.addActionListener(this);

}

public void paintComponent(Graphics g) {
    super.paintComponents(g);
    Graphics2D graphic = (Graphics2D) g;
    graphic.drawString("HTML File:", 10, 20);

}

public void actionPerformed(ActionEvent event) {
    int returnVal = 0;
    if (event.getSource() == button) {
        returnVal = chooser.showOpenDialog(FileViewer.this);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            text.setToolTipText(chooser.getSelectedFile().getName());

        } else
            o.append("Open command cancled by user.");
      }
     }
}

但是在行中:text.setToolTipText(chooser.getSelectedFile().getName());抛出了NullPointerException!

修改 我已经解决了上面提到的问题,但它无法正常工作(它没有在文本中写出文件的名称!): - (

5 个答案:

答案 0 :(得分:13)

您已全局声明text并为其指定了NULL。在FileViewer的构造函数中,您使用new再次声明它,但此声明是本地的。 actionPerformed()中引用的变量是全局变量,仍为NULL,因此您获得异常。如果你改变了

JTextField text = new JTextField("file...", 31);

text = new JTextField("file...", 31);

应该修复它。

答案 1 :(得分:4)

回答你的另一点:

text.setToolTipText(chooser.getSelectedFile().getName());

这是预期的行为吗?将鼠标悬停在文本字段上时,文件名仅显示为工具提示。要将文本直接放入JTextField,您应该调用setText()

答案 2 :(得分:2)

替换这个:

JTextField text = new JTextField("file...", 31);

用这个:

text = new JTextField("file...", 31);

答案 3 :(得分:2)

字段文本为null,就像在FileViewer构造函数中一样,您创建了一个名为text的局部变量,该变量已添加到表单中。

替换

JTextField text = new JTextField("file...", 31);

text = new JTextField("file...", 31);

答案 4 :(得分:1)

setToolTipText方法未设置文本。它设置工具提示文本,当鼠标悬停文本时显示该文本。使用setText方法。