当前位置: 首页 > 知识库问答 >
问题:

JFileChooser的showOpenDialog()不打开用于打开文件的对话框

彭雨华
2023-03-14

我试图将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
    }
}

谢谢你的帮助。

共有1个答案

逑翰翮
2023-03-14

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

我所做的主要改动是:

>

  • 我通过调用SwingUtilities invokeLater方法启动了Swing GUI。此方法确保在事件调度线程上创建和执行Swing组件。

    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
        }
    }
    

  •  类似资料:
    • 问题内容: 作为一个小项目,我认为制作文本编辑器会很酷。我目前无法打开文件。这是我打开文件的代码(是,打开是): 尝试块给我带来了麻烦。Eclipse表示未定义type 。似乎也未定义。有另一种方法可以解决此问题,或另一种工作原理相同的方法吗? 问题答案: 你需要调用在一旦返回,所以更改您的代码:

    • 问题内容: 我需要一种解决方案,以在单击时以HTML显示打开文件对话框。单击时,必须打开打开文件对话框。 我不想将输入文件框显示为HTML页面的一部分。它必须显示在单独的对话框中,该对话框不是网页的一部分。 问题答案: 这是一个不错的 它本身就是一个控件。但是div放在上面,并应用CSS样式来获得那种感觉。文件控件的不透明度设置为0,以便在单击div时似乎打开了对话框窗口。

    • 我是Java的初学者。我正在使用netbeans 7.3 IDE的GUI编辑器制作一个简单的文本编辑器。我面临的主要问题是无法保存/打开文件。我已经创建了“保存”按钮。当我删除文件选择器时,它是一个嵌入在java窗口中的正常打开的文件对话框,没有任何功能。我还尝试在单击save按钮(在源代码视图中)时创建一个新的jFileChooser,但它不起作用 简而言之,我需要一个简单的打开/保存对话框。当

    • 我使用iText7生成PDF,然后在新选项卡中打开它。 用户的意图始终是打印,因此显示PDF并让他单击打印按钮并不方便。这就是为什么我想在PDF打开时立即打开打印对话框。 这个解决方案不起作用 使用iText打开PDF时自动打开打印对话框 因为我是派系。iText7中不存在PRINTDIALOG。 我还尝试了各种不起作用的JavaScript选项,比如 如何在页面加载后直接打开打印对话框?

    • 问题内容: 以下代码的输出是: 以下代码显示了我的计算机上的异常。 当我运行程序时,主窗口可以正常打开,并且程序可以正常运行。 但是,如果您: 打开了使用“打开文件”按钮 按取消,然后 退出程序 一个被抛出。或者,如果您选择一个文件并“打开”,然后退出程序,则会引发相同的错误。在这个博客上,用示例代码解释了同样的事情,他的解决方案是尽快调用,而我这样做没有任何效果。 这是1.6.0_26中的错误吗