Качели: Фокус Компоненты - PullRequest
       1

Качели: Фокус Компоненты

1 голос
/ 08 декабря 2011

У меня есть кадр, содержащий CardLayout с различными JPanels, устанавливающими его в центр JFrame.

На 1-й панели я сфокусировался на 1-м компоненте, то есть на кнопке. Но не могу сосредоточиться на других панелях или компонентах. При настройке необходимой панели я использую следующий код:

public void SetMainPanel(String panel) {
    activePanel = panel;
    SetFontSize();
    cards.show(mainPanel, panel);
    mainPanel.revalidate();
    mainPanel.repaint();
    mainPanel.requestFocusInWindow();
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            mainPanel.grabFocus();
            mainPanel.getComponent(0).requestFocus();
        }
    });
    //mainPanel.getComponent(0).requestFocusInWindow();
}

Но я не могу сфокусироваться на панели или ее первом компоненте. Как сделать так, чтобы панель настроек имела фокусировку и фокусировку на 1-й компонент? Наконец, для фокусировки на каждой панели, что лучше - FocusPolicy, Manager, Keyboard .... Панели либо имеют все кнопки ИЛИ таблицы и кнопки ИЛИ формы с полями. Есть это 3 типа панелей. Кстати, панели, добавленные в cardLayout, являются фокусируемыми.

Любые идеи ....

РЕДАКТИРОВАТЬ: Код был отредактирован, как показано mKorbel.

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Вы должны иметь возможность добавить ComponentListener на панель и обработать событие componentShown (), чтобы сосредоточить внимание на любом компоненте, который вы хотите.

Или Фокус макета карты расширяет CardLayout для предоставления этой функции по умолчанию.

2 голосов
/ 08 декабря 2011

в большинстве случаев (когда Focus_Cycle внутри одного контейнера) работает для меня следующим кодом

    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            mainPanel.getComponent(0).grabFocus();
            mainPanel.getComponent(0).requestFocus();
            // or mainPanel.getComponent(0).requestFocusInWindow();
        }
    });
1 голос
/ 08 декабря 2011

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

Основная проблема заключается в том, что передача фокуса получаетполностью сбит с толку, когда выделенный компонент удаляется из иерархии (как это происходит при показе новой карты).В этом случае перевод должен быть обработан вручную.Решение Роба разумное и в основном такое же, как это.Оба запускают передачу фокуса с помощью обмена сообщениями card.transferFocus: преимущество по сравнению с requestFocus является двойным

  • безопасным, если нет дочернего элемента (или нет фокусируемого)
  • оставляет проблему синхронизации / организации очередибыть обработанным механизмом по умолчанию

Вот фрагмент кода подхода голых костей

    final CardLayout layout = new CardLayout();
    final JComponent main = new JPanel(layout );
    Action action = new AbstractAction("toggle cards") {

        @Override
        public void actionPerformed(ActionEvent e) {
            layout.next(main);
            Component visibleChild = main.getComponent(0).isVisible() ?
                    main.getComponent(0) : main.getComponent(1);
            visibleChild.transferFocus();        
        }
    };
    main.getActionMap().put("nextCard", action);
    main.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT)
       .put(KeyStroke.getKeyStroke("F2"), "nextCard");
    JComponent first = new JPanel();
    first.add(new JTextField(20));
    first.add(new JButton("dummy on first"));

    JComponent second = new JPanel();
    second.add(new JTextField("I'm on the second"));
    second.add(new JButton("me on second, too"));

    main.add(first, "one");
    main.add(second, "two");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...