这个JFileChooser有什么问题

时间:2013-06-14 09:06:04

标签: java swing user-interface jfilechooser

我使用JFilechooser创建了简单的gui应用程序来打开pdf文件。 gui有一个浏览按钮和一个textArea来显示文件的内容。

我创建了两个类:Gui(包含main())和GuiJFrame来实现gui,处理程序和监听器。我设法获得了窗口应用程序,但浏览按钮似乎不起作用。我不知道我在哪里弄错了,请帮帮我

import java.awt.EventQueue;

public class Gui {
    /** Launch the application. */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Gui window = new Gui();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /** Create the application. */
    public Gui() {
        initialize();
    }

    /** Initialize the contents of the frame. */
    private void initialize() {
        GuiJFrame guiJFrame = new GuiJFrame();
        guiJFrame.setVisible(true);
    }

}


import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class GuiJFrame extends JFrame {

    private JButton btnBrowse;
    private JTextArea   log, filtered_log;

    public GuiJFrame() {
        this.setTitle("TikaExtractorGui");
        this.setBounds(100, 100, 700, 800);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new BorderLayout(0, 0));

        JPanel panel_1 = new JPanel();
        this.getContentPane().add(panel_1, BorderLayout.NORTH);
        JPanel panel_2 = new JPanel();
        this.getContentPane().add(panel_2, BorderLayout.CENTER);

        /*
         * BUTTONS *
         */
        JButton btnBrowse = new JButton("Browse");
        panel_1.add(btnBrowse);
        /*
         * Text_Areas*
         */
        JTextArea log = new JTextArea(50, 30);
        panel_2.add(log);
        log.setEditable(false);
        /*
         * LAYOUT *
         */
        setLayout(new FlowLayout());
        add(panel_1, FlowLayout.CENTER);
        add(panel_2, FlowLayout.LEFT);

        JScrollPane logScrollPane1 = new JScrollPane(log);
        logScrollPane1.setSize(300, 300);
        add(logScrollPane1);

        /*
         * Setting the handlers *
         */
        ActionHandler a_handler = new ActionHandler();
        btnBrowse.addActionListener(a_handler);

    }

    private class ActionHandler implements ActionListener {

        public void actionPerformed(ActionEvent event) {

            TikaExtractorInterface ex = new TikaExtractor();
            PDFParser parser = new PDFParser();
            String g = null;

            if (event.getSource() == btnBrowse) {
                final JFileChooser fc = new JFileChooser();
                int returnVal = fc.showOpenDialog(log);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    File file = fc.getSelectedFile();
                    if (file.getName().endsWith("pdf")) {
                        file.getPath();
                        if (file != null) {
                            try {
                                g = ex.extractFromFile(parser, file);
                                log.setText(g);
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }
    }
}

4 个答案:

答案 0 :(得分:5)

我知道它为什么不起作用。

更改

 /* BUTTONS *
     *         */
    JButton btnBrowse = new JButton("Browse");
    panel_1.add(btnBrowse);

 /* BUTTONS *
     *         */
    btnBrowse = new JButton("Browse");
    panel_1.add(btnBrowse);

答案 1 :(得分:2)

这样:

 if(event.getSource() == btnBrowse)

应该是

 if(event.getSource().equals(btnBrowse))

你无法使用==在java中识别一个相等的对象,你总是必须使用equals()来确保两个对象是相同的。

此:

 JButton btnBrowse = new JButton("Browse");

应该是

 btnBrowse = new JButton("Browse");

您正在使用本地变量隐藏类成员变量,因此if子句始终与空值相对应。 btnBrowse永远不会存储在你的班级中。

答案 2 :(得分:1)

我想在actionPerformed方法的条目中添加一个System.out.println并检查是否确实调用了它。

最好为每个按钮使用动作命令,这样您就不必检查事件源是否相等。像这样:

btnBrowse.setActionCommand("Browse"); //before attaching the listener

然后在actionPerformed

String actionCommand = event.getActionCommand();
if("Browse".equals(actionCommand)) {
   JFileChooser fileChooser = new JFileChooser();
   int retVal = fileChooser.showOpenDialog(null);
}

答案 3 :(得分:0)

浏览按钮应作为filechooser的参数给出。

int returnVal = fc.showOpenDialog(log);

应该是,

 int returnVal = fc.showOpenDialog(btnBrowse);