java - 在这种特定情况下,当用户单击 X 按钮时,JFrame 窗口会出现一些问题,有什么想法吗?

标签 java swing events jframe actionlistener

我遇到以下问题:我正在开发一个向我显示 JFrame 的 Java Swing 应用程序。我要做的是,当用户单击 X 按钮时,窗口必须图标化而不是关闭(这是客户要求的要求)

我的架构非常复杂,它的工作方式如下:

我有一个名为 GUI 的类,如下所示:

public class GUI extends SingleFrameApplication implements PropertyChangeListener {

    private MainFrame mainFrame = null;

    @Override
    public void propertyChange(PropertyChangeEvent arg0) {
        showMainFrame();
        }

    private void showMainFrame() {

        mainFrame = new MainFrame(settings, tasksSettings, logAppender);
        // I add a PropertyChangeListener to the created MainFrame object:
        mainFrame.addPropertyChangeListener(this);

        //mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        mainFrame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                logger.info("Minimize the MainFrameWindows instead close it");
                ((MainFrame)e.getSource()).setState(MainFrame.ICONIFIED);
                logger.info("EVENTO ICONIZZAZIONE: " + e.getSource().toString());
            }
        });

        WindowListener exitListener = new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("GUI SingleFrameApplication --> windowClosing");
                mainFrame.OnWindowClose();
                shutdown();
                // mainFrame.setVisible(false);
                /*int confirm = JOptionPane.showOptionDialog(frame,
                "Are You Sure to Close this Application?",
                "Exit Confirmation", JOptionPane.YES_NO_OPTION,
                JOptionPane.QUESTION_MESSAGE, null, null, null);
                if (confirm == JOptionPane.YES_OPTION) {
                System.exit(1);
                }*/
            }
        };

        mainFrame.addWindowListener(exitListener);
        mainFrame.setVisible(true);
    }
@Override
protected void shutdown() {
    System.out.println("Entered into GUI ---> shutdown()");
    logger.debug("Termino l'applicazione.");
    ulogger.info(com.techub.crystalice.utils.Constants.APP_TITLE + "|Arresto " + com.techub.crystalice.utils.Constants.APP_TITLE);
    // FileUtils.saveGeneralLogFile(logAppender.getLogInFile());
    logAppender.saveGeneralLogFile();
    EventBusService.unsubscribe(this);
    if (mainFrame != null)
        mainFrame.setVisible(false);

}

}

因此,在前面的代码中,我声明了 showMainFrame() 方法,并在该方法中添加了一个窗口监听器,该监听器必须以这种方式图标化我的 MainFrame JFrame

        mainFrame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                logger.info("Minimize the MainFrameWindows instead close it");
                ((MainFrame)e.getSource()).setState(MainFrame.ICONIFIED);
                logger.info("EVENTO ICONIZZAZIONE: " + e.getSource().toString());
            }
        });

然后我有我的 MainFrame 窗口,它扩展了经典的 JFrame,如下所示:

公共(public)类 MainFrame 扩展 JFrame {

private final ConfigHelper settings;
private final TasksSettings tasksSettings;

public MainFrame(ConfigHelper settings, TasksSettings tasksSettings, LogAppender logAppender) {
    super();

    this.settings = settings;
    this.tasksSettings = tasksSettings;

            .......................................................
            .......................................................
            .......................................................
            DO SOME STUFF
            .......................................................
            .......................................................
            .......................................................
    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

}

问题是,当我单击 MainFrane 窗口的 X 按钮时,它将关闭并且不会图标化。

你能帮我解决这种情况吗?让 MainFrame 窗口图标化而不是关闭?

我认为问题是在执行结束时执行执行此操作的 shutDown() 方法:

if (mainFrame != null)
mainFrame.setVisible(false);

所以窗口没有图标化而是关闭\使其不可见

有什么想法吗?

Tnx

安德里亚

最佳答案

如果我理解正确,当您点击 X 按钮时,您需要在系统托盘中显示该应用程序的图标,这是真的吗?

在这种情况下,您对关闭事件的默认行为已经足够了(默认是在关闭时隐藏,如文档中所述)。

http://docs.oracle.com/javase/tutorial/uiswing/components/frame.html

为了管理系统托盘图标,这里有一些提示:

http://docs.oracle.com/javase/tutorial/uiswing/misc/systemtray.html

在系统托盘中,您将拥有隐藏或显示主窗口所需的代码(我不知道,但也许您在 JFrame 中根本不需要窗口监听器)

关于java - 在这种特定情况下,当用户单击 X 按钮时,JFrame 窗口会出现一些问题,有什么想法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994473/

相关文章:

java - 更新内容时重新创建 JTable

java - R.java 错误 : Class file collision

java - ICEPDF打印问题

java - 与内部类混淆,简单的 Action

java - 比较命令行参数引用返回 false 而字符串数组返回 true

java - 有没有办法让Jikes RVM通过GUI运行Java应用程序?

java - 如何定义 java 组件以便它与鼠标监听器一起工作

java - 需要更好的 Java 应用程序部署策略

events - youtube-api removeEventListener 不工作

javascript - Web 组件中的触发事件