【问题标题】:Detect when user closes floating toolbar frame检测用户何时关闭浮动工具栏框架
【发布时间】:2023-04-02 18:48:01
【问题描述】:

当用户尝试关闭浮动工具栏窗口时是否可以捕获事件? 提前致谢。

【问题讨论】:

    标签: java swing user-interface toolbar


    【解决方案1】:

    可能有一些非常简单的解决方案,但你为什么要使用它?

    我能想到的最好办法(不扩展我自己的工具栏)就是在工具栏上添加一个AncestorListener 并监控它的事件。

    不过,我采用这种方法的问题是,您需要知道最初连接到的主机,这可能不方便。

    import java.awt.BorderLayout;
    import java.awt.EventQueue;
    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
    import java.awt.event.ContainerEvent;
    import java.awt.event.ContainerListener;
    import java.awt.event.HierarchyEvent;
    import java.awt.event.HierarchyListener;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JToolBar;
    import javax.swing.SwingUtilities;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    import javax.swing.event.AncestorEvent;
    import javax.swing.event.AncestorListener;
    
    public class TestFloatingToolBar {
    
        public static void main(String[] args) {
            new TestFloatingToolBar();
        }
    
        public TestFloatingToolBar() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    final JFrame frame = new JFrame("Test");
    
                    final JToolBar tb = new JToolBar();
                    tb.add(new JButton("Pop"));
                    tb.setFloatable(true);
    
                    tb.addAncestorListener(new AncestorListener() {
                        @Override
                        public void ancestorAdded(AncestorEvent event) {
                            tell();
                            if (SwingUtilities.getWindowAncestor(tb).equals(frame)) {
                                System.out.println("...In Main Frame");
                            } else {
                                System.out.println("...Maybe floating");
                            }
                        }
    
                        @Override
                        public void ancestorRemoved(AncestorEvent event) {
                            tell();
                            if (SwingUtilities.getWindowAncestor(tb).equals(frame)) {
                                System.out.println("...In Main Frame");
                            } else {
                                System.out.println("...Maybe floating");
                            }
                        }
    
                        @Override
                        public void ancestorMoved(AncestorEvent event) {
                        }
                    });
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(tb, BorderLayout.NORTH);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
    
            });
        }
    
        public void tell() {
            Exception exp = new Exception();
            StackTraceElement[] stackTrace = exp.getStackTrace();
            System.out.println(stackTrace[1].getMethodName());
        }
    
    }
    

    【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 2010-09-13
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多