java - 检测用户何时关闭 float 工具栏框架

标签 java swing user-interface toolbar

当用户试图在 swing 中关闭 float 工具栏窗口时是否可以捕获事件? 提前致谢。

最佳答案

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

我能想出的最好办法(没有扩展我自己的工具栏)是向工具栏添加一个 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());
    }

}

关于java - 检测用户何时关闭 float 工具栏框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16211228/

相关文章:

java - jXLS 生成 Excel 2007 或 2010

java - 这个 Java HashMap 声明有什么问题?轻松点

user-interface - 如何将通用的 lisp 解释器嵌入到 gui 应用程序中

user-interface - 在 flutter 中设置列宽

javascript - jQuery autocomplete json source - 不自动完成,但只显示完整列表

java - JDBC bulkcopy 中可能的内存泄漏

java - 在 Ubuntu 上将 args 作为服务传递给 Jar

java - 如何在java中的JTextArea上添加JScrollPane?

java - 我的代码生成器无法正常工作

java - 我可以只为 JButton 类的一个子集设置 ButtonUI 吗?