Форум → Программирование → Больше языков → Java → Почему редактируемый JComboBox не реагирует на прикрученные к нему хендлеры?
Почему редактируемый JComboBox не реагирует на прикрученные к нему хендлеры?
-
Я много наэксперементировался, в книжке автор примера толком не указал…Да и вообще меня волнует особенность данного объекта.
Кручу сначала к нему FocusListener - и при потере/гэйне фокуса - ноль на масу. Кручу Кей листенер - тоже, ничерта не хочет реагировать.
НО - если даю ItemListener, и при itemStateChanged - опа, - и "жизнь на марсе обнаруживается". Еще бі, чтобі не реагировать на изминения єлементов, это было бы совсем непонятно.
Но мне надо при редактируемому Комбобоксе(когда есть возможность печатать/изменять элементы) - реагировать на события нажиманий клавиш…
Я обнаружил в самом JComboBox, в принципе есть немало методо….в т.ч. и свой actionPerfomed….
Подскажите, каким можно способом прикрутить данный обработчик?….возможно нужно както связать его в свою очередь и через КейЛистенер? -
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");
}
} -
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());
…
фокус тоже проделывал, но та же история.
Я думаю, что там нужно вытворить какоето дополнительное шаманство для применений обработчиков когда комбо в режиме едитабл…. -
-
30 ноября 2009 г. 13:06, спустя 6 минут 43 секунды
ок, значит у меня гдето там еще ошибка завалялась….
меньше с тем…
Меня вот что интересует - когда коббобокс - едитабельный, он себя автоматически ведет как текстФилд, например? Тоесть ненужно дополнительно для бокса вызывать какихто методов или чтото в том роде, чтобы он смог применять все те же обработчики что и тот же филд, текстарея и другие?
Я например смотрю в доку…там есть для бокса какойто странный метод processKeyEvent (KeyEvent e), то он на табулятор регирует(так описано). Мне кажется это совсем не то… -
30 ноября 2009 г. 13:23, спустя 17 минут 44 секунды
Rotten, зафигач сюда свой код и скажи что ы хочешь чтоб он делал -
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 данного листенера вообще не вызывается… -
30 ноября 2009 г. 13:58, спустя 3 минуты 38 секунд
Rotten,Итак, навожу код. код, касающийся верстки
ты как ведьма говоришь … НАВОЖУ ПОРЧУ ))))))Сапожник без сапог -
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);
}
});
}
}
магия -
30 ноября 2009 г. 14:17, спустя 47 секунд
а че странного)))) так же….девелопинг без порчи и шаманства(не говоря о галлонах кофе или енержи дринков(для кого - что), курения травы для энтузиастов) - это уже не девелопинг, а безвкусное и халатное отбывание очереди хер знает зачем))…. -
30 ноября 2009 г. 14:25, спустя 8 минут 1 секунду
CTAPbIu_MABP,searchCombo.getEditor().getEditorComponent().addKeyListener(KeyListener k)
Во-во…я за это и спрашивал))… Я догадывлся что надо применить чтото дополнительное в этом случае…только что именно - под вопросом.
Мавр, ты какую книгу(книги) по джаве читал), если можно поинтересоваться? Я пока Хортсмана 1й том.
Довольно внятно и интерессно, но только по основам. 2я - больше для создания профессиональных проектов написана. Но я втыкнул в сожержание, и мне показалось что там напротив - слишком много воды, которая нужна для разработки каких то мало востребованных вещей. Пока что нашел интерессное там - так это работа с базами данных. пока на очереде.
…..Спасибо за просветление в магии) -
30 ноября 2009 г. 15:21, спустя 55 минут 12 секунд
Во-во…я за это и спрашивал))
нет ты спрашивал про фокус, фокус получает searchComboМавр, ты какую книгу(книги) по джаве читал)
букварь, вторую и синюю
я уже гдето советовал Thinking in Java и серия [Spring,Hibernate,…] in Action -
30 ноября 2009 г. 15:31, спустя 10 минут 41 секунду
нет ты спрашивал про фокус, фокус получает searchCombo
Вообщемто я писал вот этоЯ думаю, что там нужно вытворить какоето дополнительное шаманство для применений обработчиков когда комбо в режиме едитабл
А касательно фокуса - я не имел ввиду конкретно его…Просто сказал что он тоже не реагирует… -
30 ноября 2009 г. 15:58, спустя 26 минут 36 секунд
http://pyha.ru/forum/topic/1198.0Мавр, ты какую книгу(книги) по джаве читал)
букварь, вторую и синюю
я уже гдето советовал Thinking in Java и серия [Spring,Hibernate,…] in Actionhttps://smappi.org/ - платформа по созданию API на все случаи жизни
Пожалуйста, авторизуйтесь, чтобы написать комментарий!