2012-09-12 29 views
2

我有一個程序,其中有很多JDialogs,JFileChoosers和其他包含JButtons的組件。我把重點放在JButton上

我知道我可以去從JButtonJButton並設置.focusPainted(false),使重點無形的,但問題是,我有一大堆的「自動」創建的組件(預定義JDialogs,JFileChoosers),我用不上到他們的JButton。我不得不手動創建整個組件,以便能夠控制其子組件(並從頭開始創建fileChooser已經很困難)...

但是,我有一個想法。 JButon每創建一次,focusPainted默認設置爲true。有沒有一種方法可以找到包含原始JButton構造函數的Java庫,並將該方法更改爲false,使其成爲默認值?

編輯:我找到了src.zip並提取AbstractButton.java。我如何編輯和重新編譯它?

其實,問題是,如何編輯Java標準庫?

P.S.你們所有人說這不是一個好習慣,這個具體例子可能會出現什麼問題(我不認爲JSL中的任何內容取決於焦點是否被繪製在Jbutton上)?我總是可以同時在兩個項目上工作,一個是原文庫,另一個是編輯過的,當我在一個錯誤中,而另一個錯誤時,我知道問題在哪裏。

+0

您可以使用'-Xbootclasspath'選項替換java核心類,但這不是一個好習慣。關於它的更多信息[here](http://blogs.sourceallies.com/2010/02/replacing-and-patching-java-application-and-core-classes/)或[here](http:// media。 techtarget.com/tss/static/articles/content/CovertJava/Sams-CovertJava-15.pdf) – cubanacan

+1

你爲什麼要混淆你的用戶? – kleopatra

+2

我經常看到有關打擊L&F和默認行爲的問題:這是一個壞習慣!平臺L&F儘可能地模擬平臺的默認L&F,以便用戶享受與其他任何應用程序類似的實驗(如果不是完全相同的話)。問問自己:「爲什麼我想違背用戶的期望?「 –

回答

0

怎麼樣從JButton繼承和用戶自己的按鈕類,您在您使用的構造函數中設置focusPaintedfalse。你不想改變標準的Java代碼。

public class MyButton extends JButton{ 

    public MyButton() { 
    super(); 
    setFocusPainted(false); 
    } 

} 

但我看到,這不會改變你的FileChooser按鈕的焦點。

0

通過繼承您當前使用的外觀來創建自定義外觀。定義兩個類就足夠了:外觀本身和按鈕UI委託。外觀應該將按鈕委託放入公用表中,替換原始按鈕委託。委託人應該重寫使用空方法繪製焦點矩形的方法,以便不繪製焦點矩形。另外,有必要重寫創建委託實例的委託中的靜態方法。

public class MyLookAndFeel extends WindowsLookAndFeel { 

    protected void initClassDefaults(UIDefaults table){ 
     super.initClassDefaults(table); 
     table.put("ButtonUI","package1.package2.MyButtonUI"); 
    } 

} 

public class MyButtonUI extends WindowsButtonUI { 

    private static MyButtonUI thiz; 

    public static ComponentUI createUI(JComponent c) { 
     if(thiz==null) thiz=new MyButtonUI(); 
     return thiz; 
    } 

    protected void paintFocus(Graphics g, AbstractButton b, Rectangle viewRect, Rectangle textRect, Rectangle iconRect){} 

} 

應用程序啓動時,激活您定製的外觀和感覺:

UIManager.setLookAndFeel("package1.package2.MyLookAndFeel"); 

這不僅從您手動創建的按鈕,也可以從按鈕的JOptionPane刪除焦點矩形,在文件對話框等。