2011-08-27 12 views
5

JTableセルのエディタとしてJFileChooserを使用しています。私は、JFileChooserを使用して有効なファイルを選択し、Enterキーを押すとファイルパスがセルに保存されるようにしたいと思います。細胞をクリアしたい場合、これは問題を引き起こします。だから私は彼らがJFileChooserをクリアし、空の文字列(またはnullのいずれか)でセルを設定します。JFileChooserは空のファイルを選択します

私の問題は、ファイルを選択していない場合、承認ボタンを押すことができないということです。私のコードでは、 "空!"決して印刷されません。ファイルが選択されていないときに承認ボタンを選択できるようにする方法はありますか?ここで私が試したものです:

JFileChooser component = new JFileChooser(){ 
     public void approveSelection(){ 
      File f = getSelectedFile(); 
      if(f==null){ 
       System.out.println("empty!"); 
       return; 
      }else{ 
       if(!f.exists()){ 
        System.out.println("does not exist!"); 
       }else{ 
        super.approveSelection(); 
       } 

      } 
     } 
    }; 
+0

「空です!」と表示されません。あなたがJFileChooserでキャンセルを押すと? –

+0

それはしません。私はJFileChooserの内部動作についてはわかりませんが、私が推測するのは、ユーザーがキャンセルすると、それが決して選択を試みることではないということです。 – Andrea

答えて

4

あなたがファイル選択をキャンセルしたときに呼び出されるJFileChooser cancelSelection()メソッドをオーバーライドすることに興味があります。

空のファイル名をJFileChooserで選択してJTableセルをクリアするのは直感的でユーザーフレンドリーではないかもしれません。 JTableセルの横に小さなボタンがある方がいいので、ユーザーがクリックするとセルの値をクリアするか、セルの値をリセットするオプションがあり、JFileChooserを使ってセル内のファイルパスを変更するだけです。

+0

私はリセットボタンについても考えていました。キャンセルを希望する場合はキャンセルボタンをそのまま残しておきます。私はそれが上の出口ボタンで行うことができると思いますが... – Andrea

+2

+1は、セルをクリアする別のボタンを持つ考えです。キャンセルを選択すると、JFileChooserを開く前の状態にセルを戻すだけです。 –

0

あなたはJFileChooserのを拡張するクラスを書き、それをクリアすると無効になりませんように、テキストフィールドを変更することができる場合、私は疑問に思うボタンを受け入れます。

+0

技術的には、Acceptボタンが有効になっています。クリックすると何も起こりません。しかし、そのコンセプトはうまくいくはずです – Andrea

+0

私は、このソリューションはファイルが選択されていないと実行可能ではないと思います。実際にJFileChooserクラスではなく、ボタンのクリックを無視して処理します。 –

1

あなたが提供したコードを実行すると、ファイルが選択されていない場合でもapproveSelectionハンドラに入ることさえありません。内部的には、ヌル選択を防止するコードがあります。この動作は、BasicFileChooserUIのApproveSelectionActionメソッドから得られます。このメソッドは、ファイル名がnullの場合、JFileChooserが「Accept」が押されたという通知を受け取らないように、セレクタのapproveSelectionを呼び出さずに戻ります。これは実際には長い醜い関数なので、たとえそれにアクセスする方法を見つけたとしても、動作を変更するのは難しいでしょう。これを回避作業の

いくつかの可能なルート:

1)あなたは別のコンポーネントでのJFileChooserを埋め込み、代わりに親コンポーネントを表示することができます。次に、JFileChooserとカスタムボタンの両方を同じパネルに追加し、カスタムボタンのボタン処理を追加します。カスタムボタンは、何も選択しないことを希望するユーザに対処することができる。この投稿は、いくつかのヒントを与えるかもしれません:JFileChooser embedded in a JPanel

2)JFileChooserの "アクセサリー"機能を悪用する可能性があります。通常はファイルタイプのプレビューを表示することを意図していますが、任意のコンポーネントが必要なので、そこに独自の「ファイルなし」ボタンを追加してリスナーを設定してダイアログを閉じることができない理由はありませんそのボタンが押された場合は空白の値にする必要があることを表のセルに通知します。比較的簡単。

3)JFileChooserダイアログをハックして、保存とキャンセルの横に余分なボタンを追加しようとするとよいでしょう。おそらくこれはあまり簡単ではないでしょうし、キャンセルボタンを見つけて親に別のボタンを追加するには、何か面倒な作業が必要になるでしょう。あなたがJavaの専門家であればおそらく実行可能です。

4)実際のファイル名ではなく空白のファイル名を表示して、通常の処理を例外にするような、ある種の「偽の」/特殊ファイルを作成することができます。

+0

総合的な分析に感謝します。少なくとも私は今なぜ承認ボタンをクリックしても何もしなかったことを理解しています。 – Andrea

+0

@Andrea非常に似た問題(ユーザーがファイルの選択をクリアできるようにする)のために、私は最近_Windows_ LAFバージョンのJFileChooserをハックして3番目のボタンを追加しました。あなたが興味を持っているなら、あなたにコードを送ることができます。 _Windows only_、あなたはMacなどのための同様のトリックを行うことができるかもしれません... – user949300

関連する問題