Mac OS X Java Swing Mouse ReleaseD event is not triggered

I encountered a problem with the Java swing mouse release event, it seems to only appear on the mac os java implementation (there is no such problem on Windows Java).

My configuration:
OS X 10.9
Java version: 1.7.0_45, vendor: Oracle Corporation

To repeat this question, please run this oracle tutorial demo class

public class MouseEventDemo extends JPanel
implements MouseListener {
BlankArea blankArea;
JTextArea textArea;
static final String NEWLINE = System.getProperty( "line.separator");

public static void main(String[] args) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (Inst antiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});< br />}

/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event dispatch thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("MouseEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new MouseEventDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}

public MouseEventDemo() {
super(new GridLayout(0,1)) ;
blankArea = new BlankArea(Color.YELLOW);
add(blankArea);
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setPreferredSize(new Dimension(200, 75));
add(scrollPane );
TextField tf=new TextField(10);
add(tf);

//Register for mouse events on blankArea and the panel.
blankArea. addMouseListener(this);
addMouseListener(this);
setPreferredSize(new Dimension(450, 450));
setBorder(BorderFa ctory.createEmptyBorder(20,20,20,20));
}

void eventOutput(String eventDescription, MouseEvent e) {
textArea.append(eventDescription + "detected on "
+ e.getComponent().getClass().getName()
+ "." + NEWLINE);
textArea.setCaretPosition(textArea.getDocument().getLength());
}

public void mousePressed(MouseEvent e) {
eventOutput("Mouse pressed (# of clicks: "
+ e.getClickCount() + ")" , e);
}

public void mouseReleased(MouseEvent e) {
eventOutput("Mouse released (# of clicks: "
+ e.getClickCount() + ")", e);
}

public void mouseEntered(MouseEvent e) {
eventOutput("Mouse entered", e);
}

public void mouseExited(MouseEvent e) {
eventOutput("Mouse exited", e);
}

public void mouseClicked(MouseEvent e) {< br /> eventOutput("Mouse clicked (# of clicks: "
+ e.getClickC ount() + ")", e);
}


public class BlankArea extends JLabel {
Dimension minSize = new Dimension(100, 50);< br />
public BlankArea(Color color) {
setBackground(color);
setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.black));
}

public Dimension getMinimumSize() {
return minSize;
}

public Dimension getPreferredSize() {
return minSize;
}
}
}

Except for the following, BlankArea’s “Mouse Release” event will be triggered completely in all cases:

>Press Blank area (yellow square)
>Drag the mouse outside the main frame of the application
>Return the mouse in the main frame to the text area (don’t enter the source blank area)
>Release the mouse button.
Result->The mouse release was not triggered. (OS X Java specific issue)

Thank you for your help.

Edit:
I added at the bottom of the main frame A TextField.
Now, if all the above case steps are repeated, but the mouse is completely released on the TextField, the “mouse_released” event will be triggered, but it is still not on the TextArea.

Using Java 6 on Mac OS X will also exhibit the observed behavior. Please note that the getComponent()” return event Initiator of “. Generally, your program should not rely on unusual, platform-specific results Since Windows behavior is not documented, your actual goal may provide a more reliable method.

Correction: This is a regression of 1.7.0_45 on Mac OS X, in Checked in JDK-8013475.

I encountered a problem with the Java swing mouse release event, and it seems to only appear on the mac os java implementation (in There is no such problem on Windows Java).

My configuration:
OS X 10.9
Java version: 1.7.0_45, vendor: Oracle Corporation

To repeat this question, please run this oracle tutorial demo class

public class MouseEventDemo extends JPanel
implements MouseListener {
BlankArea blankArea;
JTextArea textArea;
static final String NEWLINE = System.getProperty("line.separator");

public static void main(String[] args) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
//UIManager.setLookAndFeel(" com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {< br /> ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run () {
createAndShowGUI();
}
});
}

/**
* Create the GUI and show it . For thread safety,
* this method should be invoked from the
* event dispatch thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame("MouseEventDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//Create and set up the content pane.
JComponent newContentPane = new MouseEventDemo();
newContentPane.setOpaque(true); //content panes must be opaque
frame.setContentPane(newContentPane);

//Display the window.
frame.pack();
frame.setVisible(true);
}< br />
public MouseEventDemo() {
super(new GridLayout(0,1));
blankArea = new BlankArea(Color.YELLOW);
add(blankArea);
textArea = new JTextArea();
textArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setVerticalScrollBarPolicy(
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS );
scrollPane.setPreferredSize(new Dimension(200, 75));
add(scrollPane);
TextField tf=new TextField(10);
add(tf);

//Register for mouse events on blankArea and the panel.
blankArea.addMouseListener(this);
addMouse Listener(this);
setPreferredSize(new Dimension(450, 450));
setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
)
< br />void eventOutput(String eventDescription, MouseEvent e) {
textArea.append(eventDescription + "detected on "
+ e.getComponent().getClass().getName()
+ "." + NEWLINE);
textArea.setCaretPosition(textArea.getDocument().getLength());
}

public void mousePressed(MouseEvent e) {
eventOutput("Mouse pressed (# of clicks: "
+ e.getClickCount() + ")", e);
}

public void mouseReleased(MouseEvent e) {
eventOutput("Mouse released (# of clicks: "
+ e.getClickCount() + ")", e);
}

public void mouseEntered (MouseEvent e) {
eventOutput("Mouse entered", e);
}

public void mouseExited(MouseEvent e) {
eventOutput("Mouse exited" , e);
}

public void mouseClicked(Mou seEvent e) {
eventOutput("Mouse clicked (# of clicks: "
+ e.getClickCount() + ")", e);
}


public class BlankArea extends JLabel {
Dimension minSize = new Dimension(100, 50);

public BlankArea(Color color) {
setBackground(color);< br /> setOpaque(true);
setBorder(BorderFactory.createLineBorder(Color.black));
}

public Dimension getMinimumSize() {
return minSize;
}

public Dimension getPreferredSize() {
return minSize;
}
}
}

Divide the following In all cases, BlankArea’s “Mouse Release” event will be triggered completely in all cases:

>Press the blank area (yellow square)
>Drag the mouse outside the main frame of the application
>Return the mouse in the main frame to the text area (do not enter the source blank area)
>Release the mouse button.
Result->The mouse release is not triggered. (OS X Java specific issue)

< p>Thank you for your help.

Edit:
I added a TextField at the bottom of the main frame.
Now, if you repeat all the above case steps, but release the mouse completely on the TextField, The “mouse_released” event will be triggered, but it is still not on the TextArea.

The observed behavior will also occur when using Java 6 on Mac OS X. Please note , getComponent()"Return to the originator of the event". Generally, your program should not rely on unusual, platform-specific results. Since Windows behavior is not documented, your actual goal may provide a more reliable method.

< /p>

Correction: This is a regression of 1.7.0_45 on Mac OS X, checked in JDK-8013475.

< /p>

Leave a Comment

Your email address will not be published.