2011-08-27 58 views
5

我正在使用JFileChooser作爲JTable單元格的編輯器。我希望用戶使用JFileChooser選擇一個有效的文件,然後當它們回車時,文件路徑被保存到單元格中。如果他們想要清除單元格,這會出現問題。所以我希望他們清除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

您可能對overidding JFileChooser cancelSelection()方法感興趣,當用戶取消文件選擇時調用此方法。

也許它不直觀和用戶友好,用JFileChooser選擇一個空文件名進行JTable單元清除。最好在JTable單元旁邊有一個小按鈕,這樣如果用戶單擊它或任何其他選項重置單元格值並僅使用JFileChooser更改單元格中的文件路徑,它將清除單元格值。

+0

我也曾想過重置按鈕。如果用戶想要取消,我想離開取消按鈕。雖然我想這可以通過頂部的退出按鈕完成...... – Andrea

+2

+1的想法有一個單獨的按鈕,清除細胞。選擇cancel應該確實將單元格恢復到JFileChooser打開之前的狀態。 –

0

我不知道,如果你可以寫一個擴展的JFileChooser類,並修改文本字段,以便清除它不會禁用接受按鈕。

+0

從技術上講,「接受」按鈕已啓用,但單擊它時沒有任何反應。但這個概念應該可行 – Andrea

+0

我不認爲這個解決方案對於沒有選擇的文件是可行的。它實際上不在JFileChooser類中,它處理和忽略按鈕點擊。 –

1

當您運行您提供的代碼時,如果未選擇任何文件,它甚至不會進入approveSelection處理程序。在內部,有防止空選擇的代碼。 BasicFileChooserUI的ApproveSelectionAction方法中的這種行爲具有檢查,如果文件名爲null,它會在選擇器上調用approveSelection時返回,所以JFileChooser從不會收到「Accept」被按下的通知。這是一個非常長的難看的函數,所以即使你找到了訪問它的方法,改變行爲也是非常棘手的。解決此工作的

幾種可能的途徑:

1)你可以嵌入在JFileChooser的另一個組件,並顯示父組件來代替。然後,您將JFileChooser和您的自定義按鈕添加到同一個面板,併爲自定義按鈕添加按鈕處理。自定義按鈕可以處理希望不選擇任何內容的用戶。這篇文章可能會提供一些提示:JFileChooser embedded in a JPanel

2)您可能會濫用JFileChooser的「附件」功能。通常情況下,它是「意圖」顯示文件類型的預覽,但由於它需要一個任意的組件,所以沒有理由不能在那裏添加你自己的「No File」按鈕,並設置一個監聽器,並關閉對話框如果按下該按鈕並將通知發送到您的表格單元格,它應該是空白值。相對容易。 3)你可以嘗試破解JFileChooser對話框,在保存並取消旁邊添加一個額外的按鈕。這可能不是很容易,你可能不得不做一些棘手的事情來找到取消按鈕並向其父母添加另一個按鈕。如果你是java專家,可能只有可行。

4)您可以創建某種「假」/特殊文件,如果選中,您會對正常處理進行例外處理,並顯示空白文件名而不是真實文件名。

+0

感謝您的全面分析。至少我現在明白爲什麼點擊批准按鈕沒有做任何事情。 – Andrea

+0

@Andrea對於一個非常類似的問題(允許用戶清除文件選擇)我最近砍掉了JFileChooser的_Windows_ LAF版本以添加第三個按鈕。如果你有興趣,我可以給你發送代碼。 _Windows only_,雖然你可能可以爲Mac等做類似的技巧... – user949300

相關問題