2011-06-09 105 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它的布局,否则它被建造,而你的按钮将不会有根窗格。