当前位置: 首页 > 面试题库 >

Swing WindowListener如何关闭JFrame

壤驷瑾瑜
2023-03-14
问题内容

我有一个框架,并想在用户关闭它时提示以保存文档。但是,如果它们取消,则框架不应关闭。

frame.addWindowListener(new SaveOnCloseWindowListener(fileState));
...
public class SaveOnCloseWindowListener extends WindowAdapter {
    private final FileState fileState;

    public SaveOnCloseWindowListener(FileState fileState) {
        this.fileState = fileState;
    }

    public void windowClosing(WindowEvent e) {
        if (!fileState.onQuit())
            cancelClose();  
    }
}

FileState查看文档是否脏了。如果不是,则不执行任何操作并返回true。如果脏了,它会询问用户是否要保存(是/否/取消)。如果用户此时取消,则应中止windowClosing。

我在网上看到的所有建议都涉及显式退出windowClosing方法,从而覆盖JFrame.setDefaultCloseOperation()的用法,并复制JFrame.processWindowEvent()中的代码

我实际上有一个肮脏的解决方案,但想看看是否有更清洁的解决方案

干杯


问题答案:

正确的方法是设置JFrame.setDefaultCloseOperationDO_NOTHING_ON_CLOSE创建窗口时。然后仅致电setVisible(false)dispose()当您的用户接受关闭时,或者在不接受关闭时不执行任何操作。

这样做的全部目的JFrame.setDefaultCloseOperation只是为了避免实施WindowListeners最简单的操作。这些默认关闭操作执行的操作非常简单。

编辑:

我添加了我正在描述的解决方案。假设您要完全删除框架。

frame.setDefaultCloseOperation(setDefaultCloseOperation);
frame.addWindowListener(new SaveOnCloseWindowListener(fileState));
...

public class SaveOnCloseWindowListener extends WindowAdapter {
    private final FileState fileState;

    public SaveOnCloseWindowListener(FileState fileState) {
        this.fileState = fileState;
    }

    public void windowClosing(WindowEvent e) {
        if (fileState.onQuit())
            frame.dispose();
    }
}


 类似资料:
  • 问题内容: 我找不到有关如何关闭hbm2ddl的参考。 问题答案: 只是忽略默认设置,使Hibernate不执行任何操作。从参考文档中: 1.1.4。hibernate配置 该选项打开直接在数据库中自动生成数据库模式的功能。 也可以通过删除配置选项将其关闭 ,或在SchemaExport Ant任务的帮助下将其重定向到文件。 设置为(未记录)可能会生成警告,例如:

  • 我有这个密码... 有人知道为什么它不停吗? 我也尝试了下面的一个新的主要方法,但它一直在运行。 public static void main(string[]args){ApplicationContext context=new ClassPathXmlApplicationContext(“ApplicationContext.xml”);((ConfigurableApplication

  • 我正在使用sql server jdbc驱动程序mssql-jdbc-9.2.1.jre8-sources.jar并创建的对象。 在用host-credential-etc进行设置后,打开连接和关闭连接,如何关闭SQLServerDataSource对象本身,在api中找不到任何方法。 https://javadoc.io/doc/com.microsoft.sqlserver/mssql-jdb

  • 我们有一个按日期对数据进行分区的系统。 例如,在SqlServer中,每个月有一个数据库的数据。每个月分区使用包装在C3P0连接池中的Jdbc驱动程序数据源。 经过一段时间后,分区的日期范围变得足够老,我们想要离线它。在这种情况下,我们只需从可用列表中删除相关月份的。 但是,理想情况下,当脱机时,我希望“关闭”以便池放弃到DB的所有连接。 没有可供我调用的close方法,因此我不确定如何清理该方法

  • 问题内容: 每当我们从数据库或类似来源获取一些用户输入的内容并进行一些编辑时,我们都可能会检索仅包含开始标记但没有结束标记的部分。 这可能会妨碍网站的当前布局。 有客户端或服务器端的方法可以解决此问题吗? 问题答案: 找到了一个很好的答案: 使用PHP 5并使用DOMDocument对象的loadHTML()方法。此自动解析格式错误的HTML,随后对saveXML()的调用将输出有效的HTML。D

  • 我不想更改端口号,但收到异常“exception in thread”main“java.net.BindException:Address already in use:JVM_Bind” ServerSocket服务器=新服务器套接字(1234180);