ФорумПрограммированиеБольше языковJava → Почему редактируемый JComboBox не реагирует на прикрученные к нему хендлеры?

Почему редактируемый JComboBox не реагирует на прикрученные к нему хендлеры?

  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2009 г. 12:16

    Я много наэксперементировался, в книжке автор примера толком не указал…Да и вообще меня волнует особенность данного объекта.
    Кручу сначала к нему FocusListener - и при потере/гэйне фокуса - ноль на масу. Кручу Кей листенер - тоже, ничерта не хочет реагировать.
    НО - если даю ItemListener, и при itemStateChanged - опа, - и "жизнь на марсе обнаруживается". Еще бі, чтобі не реагировать на изминения єлементов, это было бы совсем непонятно.
    Но мне надо при редактируемому Комбобоксе(когда есть возможность печатать/изменять элементы) - реагировать на события нажиманий клавиш…
    Я обнаружил в самом JComboBox, в принципе есть немало методо….в т.ч. и свой actionPerfomed….
    Подскажите, каким можно способом прикрутить данный обработчик?….возможно нужно както связать его в свою очередь и через КейЛистенер?
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 30 ноября 2009 г. 12:33, спустя 16 минут 16 секунд

    в чем трабла?


    public class FocusEventDemo extends JFrame
    implements FocusListener {

    public FocusEventDemo() {
       JComboBox comboBox = new JComboBox(/**/);
       comboBox.addFocusListener(this);
       add(comboBox);
    }

    public void focusGained(FocusEvent e) {
       System.out.println("Focus gained");
    }

    public void focusLost(FocusEvent e) {
        System.out.println("Focus lost");
    }

    }
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2009 г. 12:41, спустя 8 минут 17 секунд

    CTAPbIu_MABP, я этот пример кстати применял уже на своем)…
    Но в моем селекте на фокус чето не реагирует. гдето в книге вычитал, что мол нужно еще определять родительский компонент, в котором элемент формы владеет фокусом….
    типа
    KeyboardFocusManager m = KeyboardFocusManager.getCurrentKeyboardFocusManager();
    Component o = m.getFocusOwner();
    Window focused = m.getFocusedWindow();

    Но даже если так, то где использовать результативные переменные - хер знает…
    Но не в фокусе дело…Хоть мне и более важен KeyListener, но всеравно не могу понять почему мой комбо игнорит обработчика?
    final JComboBox SearchCombo = new JComboBox();
    Box vb = Box.createVerticalBox();

    b.add(new JLabel("Find:"));
    b.add(Box.createHorizontalStrut(80));

    b.add(SearchCombo);
    SearchCombo.setEditable(true);
    class onKeyHitSearchCombo extends KeyAdapter
    {


    public void keyReleased(KeyEvent event)
    {

    System.out.println("released.");

    }
    }

    SearchCombo.addKeyListener(new onKeyHitSearchCombo());




    фокус тоже проделывал, но та же история.
    Я думаю, что там нужно вытворить какоето дополнительное шаманство для применений обработчиков когда комбо в режиме едитабл….
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2009 г. 13:06, спустя 6 минут 43 секунды

    ок, значит у меня гдето там еще ошибка завалялась….
    меньше с тем…
    Меня вот что интересует - когда коббобокс - едитабельный, он себя автоматически ведет как текстФилд, например? Тоесть ненужно дополнительно для бокса вызывать какихто методов или чтото в том роде, чтобы он смог применять все те же обработчики что и тот же филд, текстарея и другие?

    Я например смотрю в доку…там есть для бокса какойто странный метод processKeyEvent (KeyEvent e), то он на табулятор регирует(так описано). Мне кажется это совсем не то…

  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 30 ноября 2009 г. 13:23, спустя 17 минут 44 секунды

    Rotten, зафигач сюда свой код и скажи что ы хочешь чтоб он делал
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2009 г. 13:54, спустя 30 минут 37 секунд

    ок… будем делать, как говорит мой шеф - "в лоб")…
    Итак, навожу код. код, касающийся верстки/компоновок вписивать не буду, тут он не нужен - т.к. тема не та).

    final JComboBox SearchCombo = new JComboBox();

    SearchCombo.setEditable(true);

    final JButton OKButton = new JButton("OK");



    class onKeyHitSearchCombo extends KeyAdapter
    {


    public void keyReleased(KeyEvent event)
    {

    try{
    String s = (String)SearchCombo.getSelectedItem();
    //System.out.println(s);
    boolean enabled = (s.isEmpty() || s == null) ? false : true;// можно и по s.lenth == 0, думаю нету разницы
    OKButton.setEnabled(enabled);
    //System.out.println(enabled);

    }
    catch(NullPointerException e){
    OKButton.setEnabled(false);
    }

    }
    }

    SearchCombo.addKeyListener(new onKeyHitSearchCombo());


    думаю тут и комментариев не надо…. Хотя на всяк лишний скажу: когда я пишу в в боксе значение, мне надо чтобы , подобно, например Текстфилду КейЛистенер выслежывал состояния комбобокса. И когда поле пустое или зануленное - тогда нужно деактивировать кнопку "Ок", а в обратном случае - активировать…
    Проблема: метод keyReleased данного листенера вообще не вызывается…
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 30 ноября 2009 г. 13:58, спустя 3 минуты 38 секунд

    Rotten,
    Итак, навожу код. код, касающийся верстки
    ты как ведьма говоришь … НАВОЖУ ПОРЧУ ))))))
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 30 ноября 2009 г. 14:17, спустя 18 минут 51 секунду

    package ua.kiev.mabp;

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class FocusEventDemo extends JFrame {
    final static String newline = "\n";
    JTextArea display;

    public FocusEventDemo(String name) {
    super(name);
    }

    public void addComponentsToPane(final Container pane) {

    final JComboBox searchCombo = new JComboBox();
    searchCombo.setEditable(true);
    final JButton okButton = new JButton("OK");

    searchCombo.getEditor().getEditorComponent().addKeyListener(new KeyListener() {
    public void keyTyped(KeyEvent e) {
    System.out.print("keyTyped");
    }

    public void keyPressed(KeyEvent e) {
    System.out.print("keyPressed");
    }

    public void keyReleased(KeyEvent e) {
    System.out.print("keyReleased");
    try {
    String s = (String) searchCombo.getSelectedItem();
    boolean enabled = (!(s.isEmpty() || s == null));
    okButton.setEnabled(enabled);
    }
    catch (NullPointerException npe) {
    okButton.setEnabled(false);
    }
    }
    });
    add(searchCombo);
    add(okButton);

    pane.setLayout(new GridBagLayout());
    setPreferredSize(new Dimension(450, 450));
    ((JPanel) pane).setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    }

    public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    FocusEventDemo frame = new FocusEventDemo("FocusEventDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.addComponentsToPane(frame.getContentPane());
    frame.pack();
    frame.setVisible(true);
    }
    });
    }
    }



    магия
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2009 г. 14:17, спустя 47 секунд

    а че странного)))) так же….девелопинг без порчи и шаманства(не говоря о галлонах кофе или енержи дринков(для кого - что), курения травы для энтузиастов) - это уже не девелопинг, а безвкусное и халатное отбывание очереди хер знает зачем))….
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2009 г. 14:25, спустя 8 минут 1 секунду

    CTAPbIu_MABP,
    searchCombo.getEditor().getEditorComponent().addKeyListener(KeyListener k)

    Во-во…я за это и спрашивал))… Я догадывлся что надо применить чтото дополнительное в этом случае…только что именно - под вопросом.
    Мавр, ты какую книгу(книги) по джаве читал), если можно поинтересоваться? Я пока Хортсмана 1й том.
    Довольно внятно и интерессно, но только по основам. 2я - больше для создания профессиональных проектов написана. Но я втыкнул в сожержание, и мне показалось что там напротив - слишком много воды, которая нужна для разработки каких то мало востребованных вещей. Пока что нашел интерессное там - так это работа с базами данных. пока на очереде.
    …..Спасибо за просветление в магии)
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz 30 ноября 2009 г. 15:21, спустя 55 минут 12 секунд

    Во-во…я за это и спрашивал))

    нет ты спрашивал про фокус, фокус получает searchCombo


    Мавр, ты какую книгу(книги) по джаве читал)

    букварь, вторую и синюю
    я уже гдето советовал Thinking in Java и серия [Spring,Hibernate,…] in Action
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz 30 ноября 2009 г. 15:31, спустя 10 минут 41 секунду

    нет ты спрашивал про фокус, фокус получает searchCombo

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

    А касательно фокуса - я не имел ввиду конкретно его…Просто сказал что он тоже не реагирует…
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 30 ноября 2009 г. 15:58, спустя 26 минут 36 секунд



    Мавр, ты какую книгу(книги) по джаве читал)

    букварь, вторую и синюю
    я уже гдето советовал Thinking in Java и серия [Spring,Hibernate,…] in Action
    http://pyha.ru/forum/topic/1198.0
    https://smappi.org/ - платформа по созданию API на все случаи жизни

Пожалуйста, авторизуйтесь, чтобы написать комментарий!