1

JFileChooserリモートファイルシステムのビューとして を実装しています。getFiles()が呼び出されたときFileSystemViewに、ディレクトリの場所のデータを使用してリモート システムに要求を送信します。

次に、参照しているディレクトリ内のすべてのファイルを含むバックパケットを非同期に受信します。その後、ビューを更新する準備ができているファイルを設定しています(次回getFiles()呼び出されると、受信したファイルの配列が返されます)が、問題は私がJFileChoosersビューを更新する方法がわかりません。

私はもう試した

fileChooser.updateUI();

ただし、次の例外がスローされます。

Exception in thread "pool-1-thread-31" java.lang.NullPointerException
    at com.sun.java.swing.plaf.windows.WindowsFileChooserUI.setDirectorySelected(Unknown Source)
    at javax.swing.plaf.basic.BasicFileChooserUI$Handler.valueChanged(Unknown Source)
    at javax.swing.JList.fireSelectionValueChanged(Unknown Source)
    at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source)
    at javax.swing.DefaultListSelectionModel.moveLeadSelectionIndex(Unknown Source)
    at sun.swing.FilePane.clearSelection(Unknown Source)
    at sun.swing.FilePane.doFilterChanged(Unknown Source)
    at sun.swing.FilePane.propertyChange(Unknown Source)
    at java.beans.PropertyChangeSupport.fire(Unknown Source)
    at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
    at java.beans.PropertyChangeSupport.firePropertyChange(Unknown Source)
    at java.awt.Component.firePropertyChange(Unknown Source)
    at javax.swing.JFileChooser.setFileFilter(Unknown Source)
    at javax.swing.JFileChooser.addChoosableFileFilter(Unknown Source)
    at javax.swing.JFileChooser.updateUI(Unknown Source)
    at com.ruuhkis.remoteserver.ui.RemoteView.updateFiles(RemoteView.java:252)
    at com.ruuhkis.remoteserver.ui.RemoteApplication.onFileListReceived(RemoteApplication.java:122)
    at com.ruuhkis.remoteserver.packets.impl.FileListPacket.handlePacket(FileListPacket.java:32)
    at com.ruuhkis.remoteserver.packets.PacketHandler$1.run(PacketHandler.java:57)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

ディレクトリにいて、新しいファイルリストを受信したことがわかっているときにf5を押すと、ロードしたばかりの新しいファイルが表示されます.f5を押す必要がないようにするにはどうすればよいですか? また、f5 を押すと、システムはディレクトリの既存のデータを再ロードします。

現在のコードは基本的に次のとおりです。

    view = new FileSystemView() {

        int c;

        @Override
        public File[] getFiles(File dir, boolean useFileHiding) {

            if(!auto) {
                PacketBuilder builder = new PacketBuilder(OpCodes.FILE_LIST_REQUEST_PACKET.getOpCode());
                root = dir.getAbsolutePath();
                builder.writeString(dir.getAbsolutePath());
                builder.write(RemoteView.this.remote.getChannel());
            }
            auto = false;



            if(dirContent == null)
                return new File[]{new File((c++) + ".txt")};
            else
                return dirContent;
        }

        @Override
        public Boolean isTraversable(File arg0) {
            return true;
        }

        @Override
        public File createNewFolder(File arg0) throws IOException {
            // TODO Auto-generated method stub
            return null;
        }
    };

cは基本的にテスト用だったので、システムがリフレッシュされるかどうかを確認できます

ファイルリストを受け取ったら、次のようにします。

public void updateFiles(String list) {
    String[] parts = list.split("" + ((char)10));
    File[] files = new File[parts.length];

    for(int i = 0 ; i < parts.length; i++) {
        files[i] = new File(root + File.separatorChar + parts[i]);

    }



    dirContent = files;

    fileChooser.setCurrentDirectory(new File(root));

    fileChooser.updateUI();

    auto = true;

}
4

2 に答える 2

3
  • fileChooser.updateUI();カスタム UI を適用するため、またはルック アンド フィールからメソッドを変更するために、これを呼び出さないでください。

  • JList、またはJTree asを使用してから、プログラムでFileSystemView新しいファイル、フォルダー eiを作成する方がよいと思います

  • 例はこちら

于 2012-10-16T12:08:22.300 に答える
2

他の JFileChooser プロジェクトを参照した後、メソッドを見つけました

fileChooser.rescanCurrentDirectory();

ファイルシステムビューを更新するようです..

質問をするたびに、すぐに答えが見つかります:/

于 2012-10-16T12:07:48.083 に答える