JFileChooser2.java
     1: //========================================================================================
     2: //  JFileChooser2.java
     3: //    en:JFileChooser2
     4: //    ja:JFileChooser2
     5: //  Copyright (C) 2003-2017 Makoto Kamada
     6: //
     7: //  This file is part of the XEiJ (X68000 Emulator in Java).
     8: //  You can use, modify and redistribute the XEiJ if the conditions are met.
     9: //  Read the XEiJ License for more details.
    10: //  http://stdkmd.com/xeij/
    11: //========================================================================================
    12: 
    13: //----------------------------------------------------------------------------------------
    14: //  JFileChooserのバグ対策
    15: //
    16: //  JFileChooserのgetSelectedFile()の説明には
    17: //    Returns the selected file. This can be set either by the programmer via setSelectedFile or by a user action,
    18: //    such as either typing the filename into the UI or selecting the file from a list in the UI.
    19: //  と書かれており、テキストフィールドに入力されたファイル名もgetSelectedFile()で取り出せることになっている
    20: //  しかし、実際にはsetSelectedFile()で設定したかリストをクリックして選択したファイル名しか取り出すことができない
    21: //  これでは新しいファイルを作れないだけでなく、
    22: //  リストをクリックしてテキストフィールドに既存のファイル名を表示させた後にそれを書き換えて新規のファイル名を入力すると、
    23: //  入力した新規のファイル名ではなくクリックした既存のファイル名が返るため、既存のファイルを破壊してしまう可能性がある
    24: //----------------------------------------------------------------------------------------
    25: 
    26: package xeij;
    27: 
    28: import java.awt.*;  //BasicStroke,BorderLayout,BoxLayout,Color,Component,Container,Cursor,Desktop,Dimension,Font,Frame,Graphics,Graphics2D,GraphicsDevice,GraphicsEnvironment,GridLayout,Image,Insets,Paint,Point,Rectangle,RenderingHints,Robot,Shape,Stroke,TexturePaint,Toolkit
    29: import java.io.*;  //BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,File,FileInputStream,FileNotFoundException,FileReader,InputStream,InputStreamReader,IOException,OutputStreamWriter,RandomAccessFile
    30: import java.lang.*;  //Boolean,Character,Class,Comparable,Double,Exception,Float,IllegalArgumentException,Integer,Long,Math,Number,Object,Runnable,SecurityException,String,StringBuilder,System
    31: import java.util.*;  //ArrayList,Arrays,Calendar,GregorianCalendar,HashMap,Map,Map.Entry,Timer,TimerTask,TreeMap
    32: import java.util.regex.*;  //Matcher,Pattern
    33: import javax.swing.*;  //AbstractSpinnerModel,Box,ButtonGroup,DefaultListModel,ImageIcon,JApplet,JButton,JCheckBox,JCheckBoxMenuItem,JDialog,JFileChooser,JFrame,JLabel,JList,JMenu,JMenuBar,JMenuItem,JPanel,JRadioButton,JScrollPane,JSpinner,JTextArea,JTextField,JTextPane,JViewport,ScrollPaneConstants,SpinnerListModel,SpinnerNumberModel,SwingConstants,SwingUtilities,UIManager,UIDefaults,UnsupportedLookAndFeelException
    34: 
    35: public class JFileChooser2 extends JFileChooser {
    36:   protected JTextField jfc2TextField;  //ファイル名のテキストフィールド
    37:   private static final Pattern JFC2_FILE_NAME_PATTERN = Pattern.compile ("\\s*(?:,\\s*)*(?:\"([^\"]*)\"?|([^\",]+))");
    38:   public JFileChooser2 (File currentDirectory) {
    39:     super (currentDirectory);
    40:     init2 ();
    41:   }
    42:   public JFileChooser2 (String currentDirectoryPath) {
    43:     super (currentDirectoryPath);
    44:     init2 ();
    45:   }
    46:   protected void init2 () {
    47:     jfc2TextField = null;
    48:     try {
    49:       //ファイル名のテキストフィールドを求める
    50:       //  ファイルチューザーの構造が異なると失敗する可能性がある
    51:       jfc2TextField = (JTextField) ((Container) ((JPanel) getAccessibleContext ().getAccessibleChild (3)).getComponent (0)).getComponent (1);
    52:     } catch (Exception e) {
    53:     }
    54:   }
    55:   //file = getSelectedFile2 ()
    56:   //  選択されたファイルを1個取り出す
    57:   public File getSelectedFile2 () {
    58:     if (jfc2TextField == null) {
    59:       return getSelectedFile ();
    60:     }
    61:     File[] files = getSelectedFiles2 ();
    62:     return files.length == 0 ? null : files[0];
    63:   }
    64:   //files = getSelectedFiles2 ()
    65:   //  選択されたファイルの配列を取り出す
    66:   public File[] getSelectedFiles2 () {
    67:     if (jfc2TextField == null) {
    68:       return getSelectedFiles ();
    69:     }
    70:     Matcher matcher = JFC2_FILE_NAME_PATTERN.matcher (jfc2TextField.getText ());
    71:     File directory = getCurrentDirectory ();
    72:     ArrayList<File> list = new ArrayList<File> ();
    73:     while (matcher.find ()) {
    74:       list.add (new File (directory, matcher.group (1) != null ? matcher.group (1) : matcher.group (2)));
    75:       if (!isMultiSelectionEnabled ()) {  //複数選択可能でなければ最初の1個で終わり
    76:         break;
    77:       }
    78:     }
    79:     return list.toArray (new File[0]);  //配列にして返す
    80:   }
    81: }  //class JFileChooser2
    82: 
    83: 
    84: