关闭模态 JInternalFrame

2023-12-10

我遵循了方法2本指南,所以现在我有一个 ModalInternalFrame 可以阻止所有其他框架的输入,正如我想要的那样。但是,我对示例进行了一项更改,现在遇到了两个问题。

改变

我删除了 JOptionPane,因为重点是显示我自己的窗格。为了使它接近,我设置closeable to true,并添加了一个InternalFrameListener,其代码与示例中的JOptionPane 侦听器相同。这不起作用,所以我还在 doDefaultCloseAction 的末尾添加了代码。

问题

  1. ModalInternal 框架永远不会消失。我认为正在抛出一些异常,但是......
  2. 我看不到任何抛出的异常,也不知道它们要去哪里。通常在调试模式下,Eclipse 将在将异常传递给 UncaughtExceptionHandler 之前停止,但在本例中不会发生这种情况。

The Code

如果我对问题的描述没有帮助,这是我的 ModalInternalFrame 版本。如果您想要更多代码,我也可以发布。抱歉,太长了,但我尽力使其尽可能简洁。

public class ModalInternalFrame extends JInternalFrame {
    public ModalInternalFrame(String title, JRootPane rootPane,
            Component desktop) {
        super(title, false, true, false, false);

        // create opaque glass pane
        final JPanel glass = new JPanel();
        glass.setOpaque(false);

        // Attach mouse listeners
        MouseInputAdapter adapter = new MouseInputAdapter() { };
        glass.addMouseListener(adapter);
        glass.addMouseMotionListener(adapter);

        this.addInternalFrameListener(new InternalFrameListenerAdapter() {
            public void internalFrameClosed(InternalFrameEvent e) { close(); }
            public void internalFrameClosing(InternalFrameEvent e){ close(); }
        });

        // Change frame border
        putClientProperty("JInternalFrame.frameType", "optionDialog");

        // Size frame
        Dimension size = getPreferredSize();
        Dimension rootSize = desktop.getSize();

        setBounds((rootSize.width - size.width) / 2,
                (rootSize.height - size.height) / 2, size.width, size.height);
        desktop.validate();
        try { setSelected(true); } 
        catch (PropertyVetoException ignored) { }

        glass.add(this);              // Add modal internal frame to glass pane
        rootPane.setGlassPane(glass); // Change glass pane to our panel
        glass.setVisible(true);       // Show glass pane, then modal dialog
    }

    private void close(){
        if (isVisible()) {
            try { setClosed(true); } 
            catch (PropertyVetoException ignored) { }
            setVisible(false);
            rootPane.getGlassPane().setVisible(false);
        }
    }

    @Override public void doDefaultCloseAction() {
        super.doDefaultCloseAction();
        close();
    }

    @Override public void setVisible(boolean flag) {
        super.setVisible(flag);
        if (flag) startModal();
        else stopModal();
    }

    private synchronized void startModal() {
        try {
            if (SwingUtilities.isEventDispatchThread()) {
                EventQueue theQueue = getToolkit().getSystemEventQueue();
                while (isVisible()) {
                    AWTEvent event = theQueue.getNextEvent();
                    Object source = event.getSource();
                    if (event instanceof ActiveEvent) {
                        ((ActiveEvent) event).dispatch();
                    } else if (source instanceof Component) {
                        ((Component) source).dispatchEvent(event);
                    } else if (source instanceof MenuComponent) {
                        ((MenuComponent) source).dispatchEvent(event);
                    } else {
                        System.err.println("Unable to dispatch: " + event);
                    }
                }
            } else { while (isVisible()) { wait(); } }
        } catch (InterruptedException ignored) {
        }

    }

    private synchronized void stopModal() { notifyAll(); }

}

Update:我发现模式对话框很适合我的需求,但如果有人有想法,我会很高兴听到它。我没有尝试过的一件事是将每个方法包装在 try {} catch (Exception e){} 中,这可能会有很大帮助。


我不能完全让你的代码运行,但这里有一个更简单的版本,基于 Sun 的例子,它确实有效——主框架中有一个按钮(占用了所有可用空间),但是单击该按钮是阻塞直到内部框架关闭。

你可以看到,我所做的几乎就是更换new JOptionPane().createInternalFrame()与我自己的框架有关。我的猜测是,当您尝试自己进行事件调度时,事情变得过于复杂。

或者我错过了什么?

public class Foo {

  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(600, 400);
    frame.setLocationByPlatform(true);

    JButton desktop = new JButton(new AbstractAction("Click me if you can") {
      @Override
      public void actionPerformed(ActionEvent e) {
        System.out.println("I have been clicked");
      }
    });
    frame.getContentPane().add(desktop);

    frame.setVisible(true);

    JInternalFrame modal = 
      new JInternalFrame("Modal Popup", false, true, false, false);
    JLabel popupContent = new JLabel("I am the popup");
    popupContent.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    modal.add(popupContent);
    modal.pack();

    JPanel glass = new JPanel();
    glass.setOpaque(false);
    glass.add(modal);
    frame.setGlassPane(glass);
    glass.setVisible(true);
    modal.setVisible(true);

    modal.addInternalFrameListener(new ModalAdapter(glass));
  }
}

class ModalAdapter extends InternalFrameAdapter {
  Component glass;

  public ModalAdapter(Component glass) {
    this.glass = glass;

    // Associate dummy mouse listeners
    // Otherwise mouse events pass through
    MouseInputAdapter adapter = new MouseInputAdapter() {
    };
    glass.addMouseListener(adapter);
    glass.addMouseMotionListener(adapter);
  }

  public void internalFrameClosed(InternalFrameEvent e) {
    glass.setVisible(false);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关闭模态 JInternalFrame 的相关文章

随机推荐

  • 如何使用其他 webcontroller odoo 9.0 更改 odoo 的默认页面

    我创建了一个具有特定功能的新 Web 控制器 我希望将此 Web 控制器作为odoo 9 0 我试过把 http route type http auth public website True in main py我的自定义 webcon
  • 链接 LLVM 导致 gcov 失败

    Passing coverage到 gcc 同时链接 LLVM 会导致undefined reference to gcov exit 来自链接器的错误 我已经建立了一个新项目来尝试解决这个问题 你可以查看github上的源码 and 检查
  • Vue.Js - Firebase 函数不能在组件上使用

    我正在使用 Vue Resource 将数据从我的网络应用程序发布到 firebase 但是后来 我发现我需要使用 firebase 集成来上传 firebase 存储中的图像 所以我将它集成到我的 src main js 中 import
  • 在 Sublime Text 2 中显示所有可能的 CSS 值的包?

    通过基本的 Sublime Text 2 构建 我获得了 CSS 值自动完成功能only当我输入值的第一个字母时 如下图所示 不过 我一直在观看 Tuts HTML CSS 网络教程 这是一个示例视频 他的 Sublime Text 构建显
  • 将 MongoDB 查询转换为 Spring MongoDB 语法

    您好 我无法将以下 mongoDB 查询转换为 spring 查询 我尝试了多种方法 但没有得到结果 db getCollection FarmerCropDataLog aggregate match cropData crop RICE
  • JSDoc 中对象中任意键的值的文档结构

    我有一个函数factory function factory events for const key in events const before after events key 论点在哪里events通常是 only before a
  • 从 Java 将多个 PDF 作为单个打印作业打印(物理打印)

    我想在一个打印作业中从java 使用java打印服务 打印多个pdf 我想将多个 pdf 文件作为单个作业发送到打印机 这样 我的 批量 中的所有文档都会一起打印 并且当我从打印机中取出它们时 不会与其他人的打印作业交错 一个批次可能包含数
  • 如何使用 JavaFX TableView 显示基于列的数据集

    我正在尝试从 Swing 切换到 JavaFX 但 TableView 出现问题 我在内存中有一个基于列的通用数据结构 例如List
  • Apple 在 AppStore 中接受的最低 iOS 目标版本?

    我有一个应用程序 我希望在所有 iOS 版本上运行 但我认为 Apple 只接受某个版本及更高版本的应用程序 我认为是 3 0 但不确定 所以我的问题是 您可以发送审核 并获得接受 的最低 iOS 目标版本是多少 如果任何具有丰富 iOS
  • codeigniter 无法在实时页面上工作,在服务器上找不到错误

    我的 codeigniter 在本地主机上完美工作 但在 live 上无法工作 我的 codeigniter 是最新版本 我也尝试较旧的版本 它总是显示在重定向上找不到的页面 routes php 设置是 route default con
  • C++:构造和初始化顺序保证

    我对 C 中的构造和初始化顺序保证有一些疑问 例如 下面的代码有四个类X Y Z and W main函数实例化一个对象class X 其中包含一个对象class Y 并且源自class Z 因此两个构造函数都会被调用 此外 const c
  • 如何优化这些循环(禁用编译器优化)?

    我需要优化一些for在不使用编译器优化标志的情况下循环提高速度 用于学校作业 给定一个特定的Linux服务器 学校拥有的 一个令人满意的改进是使其运行时间低于7秒 一个很大的改进是使其运行时间低于5秒 我这里的这段代码大约需要 5 6 秒
  • 约束命名的目的是什么

    命名约束 唯一 主键 外键 的目的是什么 假设我有一个使用自然键作为主键的表 CREATE TABLE Order LoginName VARCHAR 50 NOT NULL ProductName VARCHAR 50 NOT NULL
  • Java,如何跟踪调用的函数

    我想跟踪Java中调用的函数的开头 结尾 如以下代码 public void foo System out println begin of foo System out println e n d of foo 但维护转储代码System
  • 自动部署在 appBase 子文件夹中找到的 WAR 文件

    我有一个第三方 Web 应用程序 我想通过安装程序将其部署到 Tomcat 5 0 服务器 AutoDeploy 设置为 true 然而 该应用程序由多个 WAR 文件组成 如果我将 WAR 直接放在 webapps 下 它们就会发挥作用
  • 无法实例化应用程序 com.android.tools.fd.runtime.BootstrapApplication ?Android

    我将 Android Studio 更新到版本 2 0 但我遇到了一个问题 不知道为什么 重要错误信息 无法实例化应用程序 com android tools fd runtime BootstrapApplication java lan
  • 当鼠标悬停在图像上时显示放大的图片

    在我的网页上 我想放置一个图像 当鼠标指针悬停在该图像上时 会出现放大版本 根据评论中需求的进一步解释更新了 CSS 解决方案 http jsfiddle net 5sRTX 7 div class effectback img class
  • Python Pandas - 使用另一个数据框列的值更新数据框列

    我正在努力提高 Python 水平 并决定对我的兴趣之一进行一些分析 摔角 在这种情况下 日本摔跤 基本上我正在尝试从另一个数据帧更新一个数据帧中的值 这是我的第一个数据框的样子 Wrestler Matches DMR 0 TETSUYA
  • CORS 策略已阻止从来源“null”访问图像

    我在 OpenLayers 3 中有 JavaScript 应用程序 我的基础层是从本地图块创建的 我只在我的计算机上工作 所以我不知道为什么会出现 CORS 错误 var newLayer new ol layer Tile source
  • 关闭模态 JInternalFrame

    我遵循了方法2本指南 所以现在我有一个 ModalInternalFrame 可以阻止所有其他框架的输入 正如我想要的那样 但是 我对示例进行了一项更改 现在遇到了两个问题 改变 我删除了 JOptionPane 因为重点是显示我自己的窗格