我使用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();
}
}
}
}
}
}
}
}
答案 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);