Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

NPE on Windows 10 when showing a popup without an invoker #753

Closed
eduhoribe opened this issue Oct 21, 2023 · 2 comments · Fixed by #754
Closed

NPE on Windows 10 when showing a popup without an invoker #753

eduhoribe opened this issue Oct 21, 2023 · 2 comments · Fixed by #754
Milestone

Comments

@eduhoribe
Copy link
Contributor

After #626 released on 3.2.1 a NPE is thrown when showing a popup without an invoker on Windows 10 (or maybe Windows != 11?).

Sample code to reproduce:

import com.formdev.flatlaf.FlatDarkLaf;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;

public class Windows10PopupNPE {

    public static void main(String[] args) {
        FlatDarkLaf.setup();

        SwingUtilities.invokeLater(() -> new Form().setVisible(true));
    }

    static class Form extends JFrame {
        public Form() {
            JButton button1 = new JButton("Open popup with show()");
            button1.addActionListener(e -> {
                JPopupMenu popup = new JPopupMenu();
                popup.add(new JLabel("Opened with show()"));
                popup.show(button1, 0, button1.getHeight());
            });

            JButton button2 = new JButton("Open popup with setVisible()");
            button2.addActionListener(e -> {
                JPopupMenu popup = new JPopupMenu();
                popup.add(new JLabel("Opened with setVisible()"));
                popup.setInvoker(button2);
                Point locationOnScreen = button2.getLocationOnScreen();
                popup.setLocation(locationOnScreen.x, locationOnScreen.y + button2.getHeight());
                popup.setVisible(true);
            });

            JButton button3 = new JButton("Open popup with setVisible() but without an invoker");
            button3.addActionListener(e -> {
                JPopupMenu popup = new JPopupMenu();
                popup.add(new JLabel("Opened with setVisible()"));
                Point locationOnScreen = button3.getLocationOnScreen();
                popup.setLocation(locationOnScreen.x, locationOnScreen.y + button3.getHeight());
                popup.setVisible(true);
            });

            Container contentPane = getContentPane();
            if (contentPane instanceof JPanel) {
                ((JPanel) contentPane).setBorder(new EmptyBorder(10, 10, 10, 10));
            }
            contentPane.setLayout(new FlowLayout());
            contentPane.add(button1);
            contentPane.add(button2);
            contentPane.add(button3);

            pack();
            setLocationRelativeTo(null);

            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }
    }
}
Stacktrace:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at javax.swing.SwingUtilities.getWindowAncestor(SwingUtilities.java:137)
	at com.formdev.flatlaf.ui.FlatPopupFactory.overlapsHeavyWeightComponent(FlatPopupFactory.java:397)
	at com.formdev.flatlaf.ui.FlatPopupFactory.getPopup(FlatPopupFactory.java:107)
	at javax.swing.plaf.PopupMenuUI.getPopup(PopupMenuUI.java:61)
	at com.formdev.flatlaf.ui.FlatPopupMenuUI.getPopup(FlatPopupMenuUI.java:216)
	at javax.swing.JPopupMenu.showPopup(JPopupMenu.java:837)
	at javax.swing.JPopupMenu.setVisible(JPopupMenu.java:790)
	at org.example.Windows10PopupNPE$Form.lambda$new$2(Windows10PopupNPE.java:42)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:262)
	at java.awt.Component.processMouseEvent(Component.java:6539)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
	at java.awt.Component.processEvent(Component.java:6304)
	at java.awt.Container.processEvent(Container.java:2239)
	at java.awt.Component.dispatchEventImpl(Component.java:4889)
	at java.awt.Container.dispatchEventImpl(Container.java:2297)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
	at java.awt.Container.dispatchEventImpl(Container.java:2283)
	at java.awt.Window.dispatchEventImpl(Window.java:2746)
	at java.awt.Component.dispatchEvent(Component.java:4711)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
	at java.awt.EventQueue$4.run(EventQueue.java:733)
	at java.awt.EventQueue$4.run(EventQueue.java:731)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
@eduhoribe
Copy link
Contributor Author

Also tested on the version 3.2.4 which fixes a similar bug for Linux with Wayland and Java 21

@DevCharly
Copy link
Collaborator

Many thanks for reporting and fixing 👍

It is Windows 10 only.

Fixed in 3.2.5

@DevCharly DevCharly added this to the 3.2.5 milestone Oct 21, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants