📄 joonefilechooser.java
字号:
/* @(#)JooneFileChooser.java */package org.joone.edit;import javax.swing.*;import org.joone.log.*;import java.awt.event.*;import java.awt.*;import java.io.*;import java.util.*;import java.beans.*;/** * This class is a wrapper class, which add two additional * functionality(directory history and file preview) * to the original JFileChooser. * * It is based on EFileChooser.java written by Klaus Berg. */public class JooneFileChooser extends JFileChooser { /** * Logger * */ private static final ILogger log = LoggerFactory.getLogger(JooneFileChooser.class); private String m_dir; private FileInputStream m_fis; private ObjectInputStream m_ois; private Vector m_dirList; private final String APPLICATION_NAME = "Joone Edit"; private HistoryAndPreviewPanel m_historyAndPreviewPanel; private JComboBox m_comboBox; private TextPreviewer m_previewer; private static final long serialVersionUID = 8488231091781173351L; /** Constructing a modified JFileChooser */ public JooneFileChooser(String baseDir) { super(baseDir); // look for the history file that is saved from last session. m_dir = System.getProperty("user.home") + System.getProperty("file.separator") + APPLICATION_NAME + "_DIRECTORY_HISTORY.cfg"; if (new File(m_dir).exists()) { try { m_fis = new FileInputStream(m_dir); } catch (FileNotFoundException fnfe) { log.warn( "File '" + m_dir + "' not found. Message is : " + fnfe.getMessage()); } try { m_ois = new ObjectInputStream(m_fis); } catch (StreamCorruptedException sce) { (new File(m_dir)).delete(); m_dirList = new Vector(); } catch (IOException ioe) { log.warn( "File '" + m_dir + "' input/output error. Message is : " + ioe.getMessage()); m_dirList = new Vector(); } try { if (m_ois != null) { m_dirList = (Vector) m_ois.readObject(); if (m_dirList == null) m_dirList = new Vector(); } else m_dirList = new Vector(); } catch (OptionalDataException ode) { log.warn( "File '" + m_dir + "' does not contain object."); m_dirList = new Vector(); } catch (IOException ioe) { log.warn( "File '" + m_dir + "' input/output error. Message is : " + ioe.getMessage()); m_dirList = new Vector(); } catch (ClassNotFoundException cnfe) { log.warn("ClassNotFoundException thrown. Message is : " + cnfe.getMessage()); m_dirList = new Vector(); } try { if (m_ois != null) m_ois.close(); m_fis.close(); } catch (IOException ioe) { log.warn( "File '" + m_dir + "' input/output error. Message is : " + ioe.getMessage()) ; } } else m_dirList = new Vector(); setMultiSelectionEnabled(false); m_historyAndPreviewPanel = new HistoryAndPreviewPanel(); setAccessory(m_historyAndPreviewPanel); addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals( JFileChooser.DIRECTORY_CHANGED_PROPERTY)) { m_previewer.clear(); } if (e.getPropertyName().equals(JFileChooser .SELECTED_FILE_CHANGED_PROPERTY)) { File f = (File) e.getNewValue(); if (f != null && f.isFile()) { m_previewer.showFileContents(f); addDirectory(f); } } } }); //setCurrentDirectory(new File(".")); } public JooneFileChooser() { this("."); } /** saving the history of the directory entries */ public void saveDirectoryEntries() { FileOutputStream fos = null; ObjectOutputStream oos = null; try { fos = new FileOutputStream(m_dir); } catch (FileNotFoundException fnfe) { log.warn( "File '" + m_dir + "' not found.", fnfe ); } try { oos = new ObjectOutputStream(fos); oos.writeObject(m_dirList); oos.flush(); oos.close(); fos.close(); } catch (IOException ioe) { log.warn( "File '" + m_dir + "' input/output error. Message is : " + ioe.getMessage(), ioe ); } } /** * Saving directory into directory list. * * @param p_file the directory name that is to be added to the directory * list. The directory will be move to front of the list if * it appeals in the previous directory history, else it * is added to the front of the list. */ private void addDirectory(File p_file) { if (p_file == null || p_file.getName().equals("")) return; String absolutePath = p_file.getAbsolutePath(); int posDirSep = absolutePath.lastIndexOf( System.getProperty("file.separator")); String d = absolutePath.substring(0, posDirSep); m_dirList.removeElement(d); m_dirList.add(0, d); updateJComboBox(); } /** updating the values in the JComboBox */ private void updateJComboBox() { m_comboBox.revalidate(); m_comboBox.setSelectedIndex(0); } /** Demo application that is used for testing */ public static void main(String[] args) { final JFrame f = new JFrame("Joone FileChooser Demo"); final JooneFileChooser fc = new JooneFileChooser(); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { fc.saveDirectoryEntries(); f.setVisible(false); f.dispose(); System.exit(0); } }); // Create the menu bar JMenuBar mb = new JMenuBar(); // Set this instance as the application's menu bar f.setJMenuBar(mb); // Create the file menu JMenu m = new JMenu("File"); m.setMnemonic('F'); mb.add(m); // open file JMenuItem o = new JMenuItem("Open..."); o.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fc.setCurrentDirectory(new File(".")); String filename = e.toString(); int val = fc.showOpenDialog(f); if (val == JFileChooser.APPROVE_OPTION) { File file = fc.getSelectedFile(); if (file != null && !file.getName().equals("")) filename = file.getName(); } } }); m.add(o); f.pack(); f.setSize(310, 130); f.setVisible(true); } // Helper class /** * HistoryAndPreviewPanel class is used to create a ComboBox, * which store the directory history and a textArea, which * is used to preview the content of the file. */ private final class HistoryAndPreviewPanel extends JPanel { private static final long serialVersionUID = 8111982139735281484L; public HistoryAndPreviewPanel() { setPreferredSize(new Dimension(250, 250)); setBorder(BorderFactory.createEtchedBorder()); setLayout(new BorderLayout()); m_comboBox = new JComboBox(m_dirList); m_comboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String dir = (String) m_comboBox.getSelectedItem(); JooneFileChooser.this.setCurrentDirectory( new File(dir)); JLabel label = new JLabel(dir); label.setFont(m_comboBox.getFont()); if (label.getPreferredSize().width > m_comboBox.getSize().width) m_comboBox.setToolTipText(dir); else m_comboBox.setToolTipText(null); } }); add(m_comboBox, BorderLayout.NORTH); m_previewer = new TextPreviewer(); add(m_previewer, BorderLayout.CENTER); } } /** * TextPreviewer class is used to view the content of a file in the * JFileChooser. */ private class TextPreviewer extends JComponent { private JTextArea m_textArea = new JTextArea(); private JScrollPane m_scroller = new JScrollPane(m_textArea); private char[] m_buf = new char[500]; private static final long serialVersionUID = -1771309681222930860L; /** Creating a textArea and scrollePane */ public TextPreviewer() { m_textArea.setEditable(false); setLayout(new BorderLayout()); add(m_scroller, BorderLayout.CENTER); } /** * Displaying the content of the file in the textArea * * @param p_file the file that is to be display in the textArea. */ public void showFileContents(File p_file) { m_textArea.setText(readFile(p_file)); m_textArea.setCaretPosition(0); } /** clear the testArea */ public void clear() { m_textArea.setText(""); } /** * Reading the content of the file. * * @param p_file the content of the file that is to be read. * @return the content of the file. */ private String readFile(File p_file) { String str = null; FileReader reader = null; try { reader = new FileReader(p_file); } catch (FileNotFoundException fnfe) { log.warn( "File '" + p_file + "' not found.", fnfe); // TO DO // Does this really "return" smthg else than null ? return str; } try { int nch = reader.read(m_buf, 0, m_buf.length); if (nch != -1) str = new String(m_buf, 0, nch); reader.close(); } catch (IOException ioe) { log.warn( "File '" + m_dir + "' input/output error.", ioe); } return str; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -