这是我使用的显示,我现在面临的另一个项目问题的代码。
我没有得到任何这样的行,如果我用JScrollPane的作为是Panel2的包装。 为什么? 我想点击JScrollPane中,结果被事件打印如下。
java.awt.event.MouseEvent[MOUSE_CLICKED,(800,469),absolute(808,499),button=1,modifiers=Button1,clickCount=1] on javax.swing.JPanel[,0,0,934x612,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=javax.swing.border.LineBorder@cc0e01,flags=9,maximumSize=,minimumSize=,preferredSize=java.awt.Dimension[width=880,height=630]]
如果现在我改变
panel1.add(pane);
至
panel1.add(panel2);
然后上述得到打印的信息。
public class LostMouseEvent {
public static void main(String[] args) {
new LostMouseEvent();
}
public LostMouseEvent() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JScrollPane pane = new JScrollPane(panel2);
panel1.setPreferredSize(new Dimension(880, 630));
panel1.setBorder(BorderFactory.createLineBorder(Color.blue));
panel2.setPreferredSize(new Dimension(840, 610));
panel2.setBorder(BorderFactory.createLineBorder(Color.green));
panel1.add(pane);
frame.add(panel1);
frame.pack();
frame.setVisible(true);
frame.setSize(950, 650);
panel1.addMouseListener(new MyMouseListener());
}
});
}
private class MyMouseListener extends MouseAdapter {
@Override
public void mouseClicked (MouseEvent me) {
System.out.println(me);
}
}
}
UPD:其实在我的项目有不只是一个是Panel2更多。 我本来PANEL1和许多是Panel2内。 然后,我想换用JScrollPane的每个Panel2,而且开始面对这个问题。
我需要只有一个MouseListener的,以尽量减少对代码的更改。
- 使用EDT Swing组件的创建和操纵
- 不调用
setSize()
而调用pack()
设置之前JFrame
可见。 - 不叫
setPrefferedSize()
而忽略getPrefferedSize()
您的代码工作正常,如果将只打印消息panel1
被点击,记panel1
的背后是JScrollPane
,因而绿色边框以外的任何东西是panel1
。 为了使它成为双方合作JScrollpane
/ panel2
和JPanel
/ panel1
只需添加MouseListener
到两个必需的组件:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;
public class LostMouseEvent {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LostMouseEvent();
}
});
}
public LostMouseEvent() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
JPanel panel1 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(880, 630);
}
};
JPanel panel2 = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(840, 610);
}
};
JScrollPane pane = new JScrollPane(panel2);
panel1.setBorder(BorderFactory.createLineBorder(Color.blue));
panel2.setBorder(BorderFactory.createLineBorder(Color.green));
panel1.add(pane);
frame.add(panel1);
MouseListener ml=new MyMouseListener();
//add mouse listener to panel1 and panel2
panel1.addMouseListener(ml);
panel2.addMouseListener(ml);
//alternatively add to pane
//pane.addMouseListener(ml);
frame.pack();
frame.setVisible(true);
}
});
}
private class MyMouseListener extends MouseAdapter {
@Override
public void mouseClicked(MouseEvent me) {
System.out.println(me);
}
}
}
编辑:
我个人不推荐这个,但是,
要一个监听器添加到JFrame
,将捕获所有MouseEvent
的使用Toolkit
类并调用addAWTEventListener
像这样:
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(AWTEvent awte) {//all mouse events will be processed here you will have to check for the mouse events you are interested in
System.out.println(awte);
}
}, AWTEvent.MOUSE_EVENT_MASK);//for Mouse events only
更新1:
您还可以添加MouseListener
您JFrame
通过S 的glassPane JFrame.getGlassPane().addMouseListener(ml)
不要忘记设置的设置后的glassPane可见JFrame
可见。 这将允许你只需要添加一个Listener
。 看这里:
...
MouseListener ml = new MyMouseListener();
//add mouse listener to panel1 and panel2
//panel1.addMouseListener(ml);
//panel2.addMouseListener(ml);
//alternatively add to pane
//pane.addMouseListener(ml);
frame.getGlassPane().addMouseListener(ml);
frame.pack();
frame.setVisible(true);
frame.getGlassPane().setVisible(true);
...
UPADTE 2:
你具有的问题的主要原因MouseEvent
迷路JScrollPane
是因为它的一个bug。 见这里 。
各地显示的工作:
public Test()
{
setUI(new javax.swing.plaf.metal.MetalScrollPaneUI(){
public void installListeners(JScrollPane scrollPane){}
});
JPanel canvas = new JPanel();
canvas.add( new JLabel("Test") );
setViewportView( canvas );
setVisible(true);
}
的MouseEvent迷失在JScrollPane中
答案很/很简单,要确保没有一些关于丢失事件,也不与JScrollPane的,
摇摆的JComponent可以点火事件仅在有适当添加监听器
你没有添加的MouseListener第二的JPanel,
此JPanel放入父JPanel中,这位家长增添了那么的MouseListener只能在外面第二JPanel的边界烧制的MouseEvent,确保你的情况加入到这个容器
那么第二个JPanel的是deepestComponentAt,并且没有再发运不可能火灾事件从父坐标孩子
你可以以编程方式重新分派事件太多,