Можно ли сделать JComponent по умолчанию не сфокусированным? - PullRequest
2 голосов
/ 28 июля 2011

Я знаю, что вы можете позвонить JComponent.setFocusable(false), чтобы сделать компонент Java не сфокусированным. Но так как в моем приложении есть МНОЖЕСТВО компонентов, которыми я хочу быть таким, мне было интересно, есть ли более простой способ, чем вызывать его для каждого из десятков объектов. Как значение UIDefaults?

Я ищу это, потому что мое приложение работает в полноэкранном режиме, и на JFrame есть KeyListener, который прослушивает нажатия клавиш для запуска различных событий. Но я обнаружил, что всякий раз, когда нажимается JButton или другой добавленный компонент, он получает фокус, и ключевые события никогда не достигают JFrame. Таким образом, более элегантный способ перехвата ключевых событий одним родительским контейнером, независимо от того, на чём сфокусирован дочерний объект, также поможет решить мою проблему.

Ответы [ 4 ]

3 голосов
/ 28 июля 2011

Мне было интересно, есть ли более простой способ, чем вызывать его для каждого из десятков объектов.

Я никогда не видел ни одного.

на JFrame есть KeyListener, который прослушивает нажатия клавиш для запуска различных событий.

Не используйте KeyListener.

Вместо этого вы можете использовать JMenus и JMenuItems с ускорителями. Преимущество этого подхода заключается в том, что ключевые нажатия затем документируются в меню. См. Раздел из учебника по Swing по Как использовать меню .

Или, если вам не нравятся меню, вы должны использовать Key Bindings . Они могут быть закодированы для работы, даже если у компонента нет фокуса.

2 голосов
/ 28 июля 2011

Похоже на работу для KeyEventDispatcher:

http://download.oracle.com/javase/6/docs/api/java/awt/KeyEventDispatcher.html

Это решило бы проблему, а не лечило не связанные напрямую свойства с (неисчислимыми) побочными эффектами: -)

1 голос
/ 28 июля 2011

Как насчет:

public boolean getComponent(Container c)
{
    Component[] cmps = c.getComponents();
    for(Component cmp : cmps)
    {
        if(cmp instanceof JComponent) // or even you could specify the JComponent you want to make it not-focusable, for example (cmp instanceof JButton)
        {
            ((JComponent)cmp).setFocusable(false);
            return true;
        }
        if(cmp instanceof Container)
        {
            if(getComponent((Container) cmp)) return true;
        }
    }
    return false;
}

Тогда просто позвоните по телефону:

getComponent(YourJFrame);
0 голосов
/ 28 июля 2011

Вот довольно грубый способ пройтись по дереву и установить его на элементы, которые вам небезразличны. Просто передайте набор noFocus (или измените логику, чтобы быть всем) ...

  public static List<Component> disableFocus(final Container c, Set<Component> noFocus) {
    Component[] comps = c.getComponents();
    for (Component comp : comps) {
      if (noFucus.contains(comp) { comp.setFocusable(false); }
      if (comp instanceof Container) {
        disableFocus(comp);
      }
    }
  }
...