user3065320
user3065320

Reputation: 43

MAC OS X Java Swing Mouse Released event is not fired

I've faced a problem with Java swing mouse released event which appears seems on mac os java implementation only (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 problem 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) {
        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);
}

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(BorderFactory.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) {
    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);
        setOpaque(true);
        setBorder(BorderFactory.createLineBorder(Color.black));
    }

    public Dimension getMinimumSize() {
        return minSize;
    }

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

"Mouse Release" event for BlankArea is fired perfectly in all cases except the following:

  1. Press on Blank Area (yellow square)
  2. Drag mouse outside of main frame of application
  3. Return mouse inside of main frame to the text area (not into the source blank area)
  4. Release mouse button. Result-> Mouse Release isn't fired. (OS X Java specific problem)

Thanks for your help in advance.

EDITED: I've added a TextField at the bottom of main frame. Now, if repeat all case steps described above, but release mouse exactly on TextField the "mouse_released" event is fired, but still not on TextArea.

Upvotes: 4

Views: 1003

Answers (1)

trashgod
trashgod

Reputation: 205785

The observed behavior also prevails using Java 6 on Mac OS X. Note that getComponent() "Returns the originator of the event." In general, your program should not rely on anomalous, platform-specific results. As the Windows behavior is not documented, your actual goal may inform a more reliable approach.

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

Upvotes: 1

Related Questions