2011-06-09 62 views
1

如何創建JButton的子類,使其自己成爲窗口的默認按鈕?JButton子類將自身設置爲JFrame的默認按鈕

我知道指定一個默認按鈕是在JRootPane上設置的,而不是按鈕本身。我不想在每個窗口中添加這樣的代碼,而是通過實例化JButton的一個子類「JButton_Default」來指定默認按鈕。子類應該定位JRootPane並將其自身設置爲默認按鈕。

我試着在子類的構造函數中做這件事。不幸的是,這種方法有效。我想這是有道理的,因爲在建的按鈕還不是一種形式,所以它不能找到JRootPane。

有沒有其他的方式來編程這個JButton子類?

這裏是我的子類,它失敗:

import javax.swing.*; 

public class JButton_Default extends JButton { 
    public JButton_Default() { 
     super(); 
     JRootPane pane = this.getRootPane(); 
     pane.setDefaultButton(this); 
    } 
} 

解決----------------

下面是使自己默認爲一個JButton subsclass代碼已添加的窗口的按鈕。

import javax.swing.*; 

public class JButton_Default extends JButton { 

    @Override 
    public void addNotify() { // Upon being added to a window, make this JButton the default button of the window. 
     super.addNotify(); 
     SwingUtilities.getRootPane(this).setDefaultButton(this); 
    } 
} 

回答

3

覆蓋您的JButton類的addNotify()方法。我相信這個方法在組件被添加到框架時被調用。或者,如果這不起作用,則將AncestorListener添加到該按鈕並監聽ancestorAdded事件。

現在您知道該組件已添加到頂級容器中,因此您可以獲取根窗格並將該按鈕設置爲默認值。

+3

另外:當按鈕被添加到已經可顯示的層次結構中,或者當它的層次結構可顯示時,調用addNotify。無論如何,那麼getRootPane()應該可以工作(如果你沒有在Swing之外使用它)。 – 2011-06-09 02:06:46

+0

感謝您的澄清。 – camickr 2011-06-09 02:12:04

+0

工作!謝謝。這是我自己的默認按鈕JButton的代碼。 ----- import javax.swing。*; public class JButton_Default extends JButton { @Override public void addNotify(){//在添加到窗口時,將此JButton設置爲窗口的默認按鈕。 super.addNotify(); SwingUtilities.getRootPane(this).setDefaultButton(this); } } ----- – 2011-06-09 22:41:40

1

你需要得到根窗格在構造函數中添加this它的佈局,否則它被建造,而你的按鈕將不會有根窗格。