Обнаружение событий кнопки JSpinner - PullRequest
1 голос
/ 06 октября 2011

Мне нужно создать некоторые элементы управления JSpinner, чтобы я мог определять нажатия кнопок, , используя текущий внешний вид .Я обнаружил, что могу сделать это достаточно легко следующим образом:

class CustomSpinnerUI extends BasicSpinnerUI {
    @Override
    protected Component createNextButton() {
        // Add custom ActionListener.
    }

    @Override
    protected Component createPreviousButton() {
        // Add custom ActionListener.
    }
}

Проблема заключается в том, что, делая это, я получаю противно выглядящий прядильщик, который не использует тот же внешний вид, что и остальныемоего интерфейса.В настоящее время я использую Nimbus, но мне нужно поддерживать различные конфигурации L & F.

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

Кто-нибудь может придумать способ обойти проблему?Я полагаю, что мне нужно либо нажать на кнопку ActionListeners без подкласса BasicSpinnerUI, либо найти способ заставить CustomSpinnerUI использовать правильные L & F.

Редактировать: "внешний вид по умолчанию" -> «текущий внешний вид».

1 Ответ

5 голосов
/ 06 октября 2011

Грязный технический ответ на (как предполагается, предполагаемая) проблема «как получить доступ к кнопкам для подключения пользовательского actionListener» состоит в том, чтобы перебрать дочерние элементы счетчика и добавить слушателей к кнопкам, идентифицированным по их имени:

    JSpinner spinner = new JSpinner();
    Action action = new AbstractAction() {

        @Override
        public void actionPerformed(ActionEvent e) {
            LOG.info("button " + ((Component) e.getSource()).getName());
        }
    };
    for (Component child : spinner.getComponents()) {
        if ("Spinner.nextButton".equals(child.getName())) {
            ((JButton) child).addActionListener(action);
        }
        if ("Spinner.previousButton".equals(child.getName())) {
            ((JButton) child).addActionListener(action);
        }
    }
  • это грязно, потому что оно опирается на недокументированную деталь реализации, которую LAF может или не может уважать: Metal, Nimbus;Win не делает (что я считаю недосмотром, но это другая история: -)
  • это только техническая проблема, так как реальная проблема, кажется, где-то еще, судя по недавнему комментарию на вопрос
...