Предотвратить FocusEvents, когда компонент не сфокусирован - PullRequest
1 голос
/ 20 мая 2011

У меня есть следующий пример кода:

import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;

import javax.swing.BoxLayout;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class SampleFocus extends JFrame {

  public SampleFocus(String titel) {
    setTitle(titel);
    JTextField txtField1 = new JTextField("default-click");
    JTextField txtField2 = new JTextField("alternative-Text");
    JTextField txtField3 = new JTextField("own diaolog textfield");

    JTextArea dummyLabel = new JTextArea(10, 20);
    dummyLabel.setText("empty textarea, which is focusable");

    setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
    add(txtField1);
    add(dummyLabel);
    add(txtField2);

    JDialog altDialog = new JDialog(this);
    altDialog.add(txtField3);
    altDialog.setVisible(true);
    altDialog.pack();

    FocusAdapter myFocusListner = new FocusAdapter() {

      @Override
      public void focusGained(FocusEvent e) {
        if (e.getComponent() instanceof JTextField) {
          System.out.println("gained for TextField: "
                             + ((JTextField) e.getComponent()).getText());
        } else {
          System.out.println("gained for component: " + e.getComponent());
        }
      }
    };

    txtField1.addFocusListener(myFocusListner);
    txtField2.addFocusListener(myFocusListner);
    txtField3.addFocusListener(myFocusListner);

    // dummyLabel.addFocusListener(myFocusListner);
  }

  public static void main(String[] args) {
    JFrame frame = new SampleFocus("FocusListener  - sample");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

  }
}

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

например,

Выберите 'default-click' ==> Dialog / Textfield==> Frame / 'empty textarea'

Результат: я получаю событие FocusGained для 'щелчка по умолчанию', хотя компонент НЕ имеет фокуса.

Желаемый результат: Любой

  • Компонент 'щелчок по умолчанию' не получает FocusEvent ИЛИ

  • различают, действительно ли компонент получил Событие должным образом (например, я мог щелкнуть в нема также)

Обходной путь, который я нашел:

Присоедините к JTextArea, а также к FocusListener.Проблема в том, что это означало бы, что мне нужно присоединить к ВСЕМ моих компонентов Слушатель.Что вряд ли возможно.Есть идеи?

Есть идеи, как получить результат?

Thx LeO

Ответы [ 2 ]

0 голосов
/ 23 мая 2011

Я нашел обходной путь, чтобы проверить в focusGained-методе, находится ли текущий компонент в собственном JDialog и был ли предыдущий компонент JTextField в JFrame. Если это так, то я запоминаю полученный фокусированный компонент, меняю фокус на другой компонент, и когда я получаю focusLost, я запрашиваю его обратно к ранее запомненному компоненту.

Какой-то хак, но он работает .... Если есть идеи получше, меня интересует ...

0 голосов
/ 20 мая 2011

Работает как задумано.Вы выбираете «щелчок по умолчанию».Это получает фокус.Вы выбираете диалог.Рамка и «щелчок по умолчанию» теряет фокус.Вы выбираете Текстовую область.Теперь все становится интересным.Диалог теряет фокус.Рамка получает фокус.«щелчок по умолчанию» также получает фокус, потому что он был, когда Frame был активен.А затем «щелчок по умолчанию» теряет фокус, текстовая зона получает фокус (потому что вы нажали на текстовую область).

Попробуйте объединить события focusGained и focusLost.

Или расскажите подробнее, что вы пытаетесьвыполнить, может быть, я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...