gpt4 book ai didi

java - JFileChooser 的 showOpenDialog() 未打开用于打开文件的对话框

转载 作者:行者123 更新时间:2023-12-02 08:46:10 28 4
gpt4 key购买 nike

我正在编写一个用于合并 pdf 文件的 GUI 实用程序,但 JFileChooser 的 showOpenDialog() 方法不会打开用于打开文件的对话框。单击"file"菜单中的“打开”项时没有任何响应。为了您的方便,Apache pdfbox 库的下载链接是: https://pdfbox.apache.org/download.cgi

我尝试将 openFiles() 方法的核心移至 actionPerformed() 方法中的相应位置,但仍然不起作用。但是,在另一个人出于不同目的的代码中,showOpenDialog() 方法在从 actionPerformed 方法内调用的方法中工作。代码如下:

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import org.apache.pdfbox.multipdf.PDFMergerUtility;

public class PDFMerger extends JFrame implements ActionListener {
private static final int DEFAULT_WIDTH = 500;
private static final int DEFAULT_HEIGHT = 500;
private JMenuItem openItem;
private JMenuItem saveItem;
private JMenuItem exitItem;
private JTextArea textArea;
private JTextField textField;
private JButton bindButton;
private File[] files;
private File mergedFile;

public static void main(String[] args) {
PDFMerger pdfMerger = new PDFMerger();
pdfMerger.setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
pdfMerger.setDefaultCloseOperation(EXIT_ON_CLOSE);
pdfMerger.setVisible(true);
}

public PDFMerger () {
JMenu menu = new JMenu("File");
JMenuItem openItem = new JMenuItem("Open");
openItem.addActionListener(this);
saveItem = new JMenuItem("Save");
saveItem.setEnabled(false);
saveItem.addActionListener(this);
exitItem = new JMenuItem("Exit");
exitItem.addActionListener(this);
menu.add(openItem);
menu.add(saveItem);
menu.add(exitItem);
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);
setJMenuBar(menuBar);
textArea = new JTextArea(40, 50);
JScrollPane scrollPane = new JScrollPane(textArea);
add(scrollPane, BorderLayout.CENTER);
JPanel operationPanel = new JPanel();
BoxLayout layout = new BoxLayout(operationPanel, BoxLayout.LINE_AXIS);
operationPanel.setLayout(layout);
JLabel label = new JLabel("Result: ");
textField = new JTextField(30);
textField.setEditable(false);
bindButton = new JButton("Bind");
bindButton.addActionListener(this);
bindButton.setEnabled(false);
operationPanel.add(label);
operationPanel.add(textField);
operationPanel.add(bindButton);
add(operationPanel, BorderLayout.NORTH);
}

public void actionPerformed (ActionEvent event) {

if (event.getSource() == exitItem)
System.exit(0);
else if (event.getSource() == openItem) {
files = openFiles();
bindButton.setEnabled(false);
}
else if (event.getSource() == bindButton) {
mergedFile = mergeFiles();
saveItem.setEnabled(true);
}
else if (event.getSource() == saveItem)
saveFile();
}

public File[] openFiles () {
File[] selectedFiles = null;
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setMultiSelectionEnabled(true);
int option = chooser.showOpenDialog(PDFMerger.this);

if (option == JFileChooser.APPROVE_OPTION)
selectedFiles = chooser.getSelectedFiles();
return selectedFiles;
}

public File mergeFiles () {
File merged = null;
// TODO

return merged;
}
public void saveFile () {
//TODO
}
}

感谢您的帮助。

最佳答案

我修复了您的代码并打开了 JFileChooser。

我所做的主要更改是:

  1. 我通过调用 SwingUtilities invokeLater 方法启动了 Swing GUI。此方法确保在 Event Dispatch Thread 上创建并执行 Swing 组件。 .

  2. 我使用了 JFrame。我没有扩展 JFrame。仅当您打算重写一个或多个类方法时,才扩展 Swing 组件。

  3. 您的代码读起来很困惑。我将代码分为逻辑方法。我留下了令人困惑的代码,但是当您创建 Swing 布局时,您确实应该按行、列顺序创建组件。您还应该将特定组件的所有方法调用分组在一起。它使发现和解决问题变得更加容易。

  4. 您不应该只有一个 Action 监听器来处理所有事情。您应该为每个按钮或菜单项设置单独的操作监听器。

无论如何,这是你的代码。一旦我从逻辑上分开了事情,就更容易找到阻止 JFileChooser 显示的错误。

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

public class PDFMerger implements ActionListener {

private JFrame frame;
private JMenuItem openItem;
private JMenuItem saveItem;
private JMenuItem exitItem;
private JTextArea textArea;
private JTextField textField;
private JButton bindButton;
private File[] files;
private File mergedFile;

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new PDFMerger();
}
});
}

public PDFMerger() {
frame = new JFrame("PDF Merger");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = createJMenuBar();
frame.setJMenuBar(menuBar);

JPanel operationPanel = createOperationPanel();
frame.add(operationPanel, BorderLayout.NORTH);
JPanel textPanel = createTextPanel();
frame.add(textPanel, BorderLayout.CENTER);

frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}

private JPanel createOperationPanel() {
JPanel operationPanel = new JPanel();
BoxLayout layout = new BoxLayout(operationPanel, BoxLayout.LINE_AXIS);
operationPanel.setLayout(layout);
JLabel label = new JLabel("Result: ");
textField = new JTextField(30);
textField.setEditable(false);
bindButton = new JButton("Bind");
bindButton.addActionListener(this);
bindButton.setEnabled(false);
operationPanel.add(label);
operationPanel.add(textField);
operationPanel.add(bindButton);
return operationPanel;
}

private JPanel createTextPanel() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());

textArea = new JTextArea(40, 50);
JScrollPane scrollPane = new JScrollPane(textArea);
panel.add(scrollPane, BorderLayout.CENTER);
return panel;
}

private JMenuBar createJMenuBar() {
JMenu menu = new JMenu("File");
openItem = new JMenuItem("Open");
openItem.addActionListener(this);
saveItem = new JMenuItem("Save");
saveItem.setEnabled(false);
saveItem.addActionListener(this);
exitItem = new JMenuItem("Exit");
exitItem.addActionListener(this);
menu.add(openItem);
menu.add(saveItem);
menu.add(exitItem);
JMenuBar menuBar = new JMenuBar();
menuBar.add(menu);
return menuBar;
}

@Override
public void actionPerformed (ActionEvent event) {
if (event.getSource() == exitItem) {
frame.dispose();
System.exit(0);
} else if (event.getSource() == openItem) {
files = openFiles();
bindButton.setEnabled(false);
} else if (event.getSource() == bindButton) {
mergedFile = mergeFiles();
saveItem.setEnabled(true);
} else if (event.getSource() == saveItem)
saveFile();
}

public File[] openFiles () {
File[] selectedFiles = null;
JFileChooser chooser = new JFileChooser();
chooser.setCurrentDirectory(new File("."));
chooser.setMultiSelectionEnabled(true);
int option = chooser.showOpenDialog(frame);

if (option == JFileChooser.APPROVE_OPTION)
selectedFiles = chooser.getSelectedFiles();
return selectedFiles;
}

public File mergeFiles () {
File merged = null;
// TODO

return merged;
}
public void saveFile () {
//TODO
}
}

关于java - JFileChooser 的 showOpenDialog() 未打开用于打开文件的对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61071819/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com