Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Перехват события на форме / 9 сообщений из 9, страница 1 из 1
05.04.2007, 17:35:35
    #34441413
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
Добрый день. Подскажите если не трудно. А как сделать глобальный перехват событий происходящих во фрэйме, если на нем есть такие компоненты, ну например как кнопка.

Вот простой код(1 вариант).Обычное окно. При нажатии клавиши на клавиатуре происходит вывод сообщения на консоль.

а во втором варианте в этом окне добавилась кнопка. теперь событие связанное с фреймом не ловится. почему?

1 - вариант:
package tst;

import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Dimension;
import javax.swing.JLabel;

public class EventDemo extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
EventDemo thisClass = new EventDemo();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

/**
* This is the default constructor
*/
public EventDemo() {
super();
initialize();
this.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent ke){
System.out.println("keyPressed");
}
});
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(471, 297);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}

/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
}
return jContentPane;
}

} // @jve:decl-index=0:visual-constraint="10,10"



2 - вариант. С Кнопкой:
package tst;

import javax.swing.SwingUtilities;
import java.awt.BorderLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.Dimension;
import javax.swing.JLabel;

public class EventDemo extends JFrame {

private static final long serialVersionUID = 1L;

private JPanel jContentPane = null;

private JButton jButton = null;

/**
* This method initializes jButton
*
* @return javax.swing.JButton
*/
private JButton getJButton() {
if (jButton == null) {
try {
jButton = new JButton();
} catch (java.lang.Throwable e) {
// TODO: Something
}
}
return jButton;
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
SwingUtilities.invokeLater(new Runnable() {
public void run() {
EventDemo thisClass = new EventDemo();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisClass.setVisible(true);
}
});
}

/**
* This is the default constructor
*/
public EventDemo() {
super();
initialize();
this.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent ke){
System.out.println("keyPressed");
}
});
}

/**
* This method initializes this
*
* @return void
*/
private void initialize() {
this.setSize(471, 297);
this.setContentPane(getJContentPane());
this.setTitle("JFrame");
}

/**
* This method initializes jContentPane
*
* @return javax.swing.JPanel
*/
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
jContentPane.add(getJButton(), BorderLayout.EAST); // Generated
}
return jContentPane;
}

} // @jve:decl-index=0:visual-constraint="10,10"
...
Рейтинг: 0 / 0
06.04.2007, 11:49:21
    #34442888
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
Неужели никто не знает как организовать единый обработчик KeyPressed сразу для всех компонентов во фрэйме?
...
Рейтинг: 0 / 0
06.04.2007, 12:14:03
    #34443005
jusio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
Код: plaintext
1.
2.
3.
4.
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new  KeyEventDispatcher() {
                         public   boolean  dispatchKeyEvent(KeyEvent e) {
                            //your code
                        }
                    });
PS: Гуглом бы нашли за три минуты...
...
Рейтинг: 0 / 0
06.04.2007, 12:39:19
    #34443114
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
jusio
Код: plaintext
1.
2.
3.
4.
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new  KeyEventDispatcher() {
                         public   boolean  dispatchKeyEvent(KeyEvent e) {
                            //your code
                        }
                    });
PS: Гуглом бы нашли за три минуты...

Может и нашел бы, только хочу понять технологию . Почему даже если класс EventDemo делать как implements KeyListener, то после появления на форме любого компонента EventDemo перестает перехватывать события от Клавиатуры?
...
Рейтинг: 0 / 0
06.04.2007, 12:41:07
    #34443122
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
вернее не любого компонента а только управляющего(кнопки, радиокнопки и т.д.)
...
Рейтинг: 0 / 0
06.04.2007, 12:42:12
    #34443128
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
А за подсказку спасибо)))
...
Рейтинг: 0 / 0
06.04.2007, 12:49:06
    #34443163
jusio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
потому-что не имеет значение implements KeyListener или нет. KeyListener - это всего лиш обработчик. Если он повешен на какой либо компонент - он обрабатывает сообщения от клавиатуры только в том случае, если компонент получил фокус.
ЗЫ: Если ещё не до конца разбираетесь в технологии читайте официальный туториал, и забудьте на некоторое время о существовании графических дизайнеров ГУИ.
...
Рейтинг: 0 / 0
06.04.2007, 13:07:36
    #34443254
GKS_Samara
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
jusio пишет:

А аналогичную вещь для мыши как сделать? Чтобы любой щелчёк по кнопке
приводил бы к вызову методе некоего?

> PS: Гуглом бы нашли за три минуты...

Интересно, каким запросом? Про мышь...

--
Алексей
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
06.04.2007, 13:18:02
    #34443284
Кореец
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Перехват события на форме
jusioпотому-что не имеет значение implements KeyListener или нет. KeyListener - это всего лиш обработчик. Если он повешен на какой либо компонент - он обрабатывает сообщения от клавиатуры только в том случае, если компонент получил фокус.
ЗЫ: Если ещё не до конца разбираетесь в технологии читайте официальный туториал, и забудьте на некоторое время о существовании графических дизайнеров ГУИ.

занудно это - официальный туториал читать.пока не проглотил весь.Книжка Ноутона и Шилдта и то интереснее(хотя инфы про KeyEventDispatcher там не было....). Да и джавой заниматься приходится время от времени. Пока одно захаваешь без практики другое забывается. самый быстрый способ получения информации в моем случае это - Вас спросить)))

Поэтому вопрос номер два:

KeyEventDispatcher выполняет функцию глобального диспетчера событий, т.е. его реакция всегда быстрее реакции остальных компонент(срабатывает он первым)?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Перехват события на форме / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]