This is the code I am using to show the issue which I am facing in another project.
I am not getting any line like this if I use JScrollPane as a wrapper for panel2. Why?
I want to click on JscrollPane and got event printed as following.
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]]
If now I change
panel1.add(pane);
to
panel1.add(panel2);
Then the message above got printed.
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: In fact in my project there is more than just one panel2. Originally, I had panel1 and many panel2 inside. Then I wanted to wrap each panel2 with JScrollPane and started to face this problem.
I need to have only one MouseListener to minimize changes to the code.
setSize()rather callpack()before settingJFramevisible.setPrefferedSize()rather overridegetPrefferedSize()Your code works as expected, it will only print the message if
panel1is clicked, notepanel1is behindJScrollPane, thus anything outside the green border ispanel1. To make it work for both theJScrollpane/panel2andJPanel/panel1simply add theMouseListenerto BOTH of the required components:EDIT:
I personally would not recommend this, however,
To add a single listener to the
JFramethat will capture allMouseEvents useToolkitclass and calladdAWTEventListenerlike so:UPDATE 1:
You could also add the
MouseListenerto yourJFrames glasspane viaJFrame.getGlassPane().addMouseListener(ml)dont forget to set the glasspane visible after settingJFramevisible. This will allow you to only have to add a singleListener. See here:UPADTE 2:
The main reason for you having the problem of the
MouseEventgetting lost inJScrollPaneis because its a bug. See here.The work around shown is: