簡體   English   中英

JFileChooser 的 showOpenDialog() 不打開打開文件的對話框

[英]showOpenDialog() of JFileChooser doesn't open dialog box for opening files

我正在編寫一個用於合並 pdf 文件的 GUI 實用程序,但 JFileChooser 的 showOpenDialog() 方法沒有打開用於打開文件的對話框。 單擊“文件”菜單中的“打開”項時沒有響應。 為方便起見,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。 當您打算覆蓋一個或多個 class 方法時,您只能擴展 Swing 組件。

  3. 你的代碼讀起來很混亂。 我將代碼划分為邏輯方法。 我留下了令人困惑的代碼,但是當您創建 Swing 布局時,您確實應該按行、列順序創建組件。 您還應該將特定組件的所有方法調用組合在一起。 它使查找和解決問題變得更加容易。

  4. 你不應該對所有事情都只有一個動作監聽器。 您應該為每個按鈕或菜單項設置單獨的操作偵聽器。

無論如何,這是你的代碼。 一旦我在邏輯上分離了事物,就更容易找到阻止 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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM