Java AWTEventListener缺少事件
我有一个问题,我的侦听器无法获取所有AWT事件。 至少我希望如此。 我的另一个问题是,我无法在一段代码上重建问题:( 我所做的是: 听所有awtevent(实际上只有鼠标事件) 按下鼠标启动计时器 当计时器完成且LMB仍被按下时,鼠标指针处的组件将从层次结构中移除 在这一点上,只要我仍然按下LMB,我只会得到鼠标退出和鼠标进入的事件。没有移动、拖动甚至鼠标释放的事件 我一松开鼠标按钮,一切就恢复正常 有什么建议会导致问题吗 @编辑:代码示例已更新Java AWTEventListener缺少事件,java,swing,awt,mouse,listener,Java,Swing,Awt,Mouse,Listener,我有一个问题,我的侦听器无法获取所有AWT事件。 至少我希望如此。 我的另一个问题是,我无法在一段代码上重建问题:( 我所做的是: 听所有awtevent(实际上只有鼠标事件) 按下鼠标启动计时器 当计时器完成且LMB仍被按下时,鼠标指针处的组件将从层次结构中移除 在这一点上,只要我仍然按下LMB,我只会得到鼠标退出和鼠标进入的事件。没有移动、拖动甚至鼠标释放的事件 我一松开鼠标按钮,一切就恢复正常 有什么建议会导致问题吗 @编辑:代码示例已更新 package awtbug;
package awtbug;
import java.awt.AWTEvent;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
@SuppressWarnings("serial")
public class MyAWTBug extends JFrame{
public static void main(String[] args) {
new MyAWTBug();
}
public MyAWTBug() {
setSize(300, 300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().add(new AWTListenerPanel());
}
private class AWTListenerPanel extends JPanel implements AWTEventListener {
JPanel somePanel = new JPanel();
public AWTListenerPanel() {
Toolkit.getDefaultToolkit().addAWTEventListener(this, Long.MAX_VALUE);
this.add(somePanel);
}
@Override
public void eventDispatched(AWTEvent event) {
System.out.println("-----------------------");
System.out.println(event);
if (event instanceof MouseEvent) {
if (event.getID() == MouseEvent.MOUSE_PRESSED) {
Timer timer = new Timer(100, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
modifyTree();
}
});
timer.setRepeats(false);
timer.restart();
}
}
}
private void modifyTree() {
getContentPane().remove(somePanel);
getContentPane().add(somePanel);
System.err.println("stuff done");
}
}
}
@编辑2:
我可以把范围缩小到
外部组件移除(内部组件)
一旦我这样做,事件就停止了…不是答案,测试代码应该是
将AWTEventListener添加到JPanel、ContentPane、RootPane,而不是添加到JFrame(默认情况下,从不对KeyEvents作出反应)刚刚调整了我的代码示例。但问题仍然是,在这个示例中,所有内容都正常工作,但在我的项目中没有。因此,我正在寻找解决问题的方法。意外地,我发现将删除的组件添加到另一个容器中解决了问题。因此,这个问题仍然存在,但对我来说不再是问题。Eno对于一个空间中的许多组件,使用一个在这个空间中看到的。简洁的建议:)但是实际上我所做的是接管对鼠标事件的控制来进行手势识别等等。但这两种方法仍然可以完美地工作,因此我仍然没有一个示例代码来演示实际问题:/每个按键和鼠标(或三个组合)事件都可以从LayoutManager正确接受的JComponent中触发一个事件(在modifyTree()中引发),以使用我的代码测试您的问题,因为(未进行测试或最深的测试)看起来像(不包括按键修饰符和鼠标事件中的一些错误)正确触发事件
import java.awt.AWTEvent;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.border.LineBorder;
public class MyAWTBug implements AWTEventListener {
private JPanel panel = new JPanel();
private JFrame frame = new JFrame();
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new MyAWTBug();
}
});
}
public MyAWTBug() {
Toolkit.getDefaultToolkit().addAWTEventListener(this, Long.MAX_VALUE);
panel = new JPanel();
panel.setBackground(Color.red);
panel.setBorder(new LineBorder(Color.black, 1));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.setPreferredSize(new Dimension(300, 300));
frame.pack();
frame.setVisible(true);
}
@Override
public void eventDispatched(AWTEvent event) {
System.out.println("-----------------------");
for (AWTEventListener listener : Toolkit.getDefaultToolkit().getAWTEventListeners()) {
System.out.println(listener);
}
System.out.println("-----------------------");
System.out.println(event);
if (event instanceof MouseEvent) {
if (event.getID() == MouseEvent.MOUSE_PRESSED) {
Timer timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
modifyTree();
}
});
timer.setRepeats(false);
timer.restart();
}
}
}
private void modifyTree() {
frame.remove(panel);
panel = new JPanel();
panel.setBorder(new LineBorder(Color.black, 1));
frame.add(panel);
frame.validate();
frame.repaint();
frame.setPreferredSize(new Dimension((int) Math.random() * 50 + 300, (int) Math.random() * 50 + 300));
frame.pack();
System.err.println("stuff done");
}
}