Подкласс JButton, который устанавливает себя в качестве кнопки по умолчанию для JFrame - PullRequest
1 голос
/ 09 июня 2011

Как создать подкласс JButton, который делает себя кнопкой окна по умолчанию?

Я понимаю, что назначение кнопки по умолчанию устанавливается на 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, который делает себя кнопкой по умолчанию для окна, к которому он был добавлен.

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 );
    }
}

Ответы [ 2 ]

3 голосов
/ 09 июня 2011

Переопределите метод addNotify () вашего класса JButton. Я считаю, что этот метод вызывается, когда компонент добавляется в кадр. Или, если это не работает, тогда добавьте AncestorListener к кнопке и прослушайте событие ancestorAdded.

Теперь вы знаете, что компонент добавляется в контейнер верхнего уровня, поэтому вы можете получить корневую панель и установить кнопку в качестве кнопки по умолчанию.

1 голос
/ 09 июня 2011

Вам нужно будет получить корневую панель в конструкторе и добавить this к ее макету, потому что в противном случае ваша кнопка не будет иметь корневую панель во время ее конструирования.

...