当前位置: 首页 > 知识库问答 >
问题:

向调用者返回数据的模态JInternalFrame

陈斌蔚
2023-03-14

我有一个Java Swing应用程序和一个JInternalFrame。

在JInternalFrame中,我有一些输入字段,当我按下热键时,我希望发生以下情况:

  1. 当前JInternalFrame中的所有执行都被挂起,并且没有一个输入字段可以强制聚焦。
  2. 一个新帧(inputFrame)将以某种模态模式打开,并向填写正确值的用户提供帮助。(数据从EJB获取,并根据用户的选择进行过滤)
  3. 当用户单击OK时,inputFrame关闭,数据返回到main Frame。
  4. main Frame接受数据并继续处理。

如果可能的话,我希望 inputFrame 是一个 JInternalFrame,但这不是一个主要问题。

有人知道实现这一点的方法吗?

共有2个答案

叶书
2023-03-14

我在JOptionPane的源代码中找到了答案,我复制了两个静态方法createInternalFrame和startModal(只有一些小的更改),并在下面创建了自己的类:

public class ModalInternalPanel {

    public static  Object showInternalDialog(Component parentComponent, Container container, HasReturnValue hasReturnValue, String title)  {
        JInternalFrame frame = createInternalFrame(parentComponent, title, container);
        startModal(frame);
        if (hasReturnValue!=null) return hasReturnValue.getReturnValue(); else return null;
    }


    public static JInternalFrame createInternalFrame(Component parentComponent, String title, Container container) throws RuntimeException  {
        // Try to find a JDesktopPane.
        JLayeredPane toUse = JOptionPane.getDesktopPaneForComponent(parentComponent);
        // If we don't have a JDesktopPane, we try to find a JLayeredPane.
        if (toUse == null)  toUse = JLayeredPane.getLayeredPaneAbove(parentComponent);
        // If this still fails, we throw a RuntimeException.
        if (toUse == null) throw new RuntimeException   ("parentComponent does not have a valid parent");

        JInternalFrame frame = new JInternalFrame(title); 


        frame.setContentPane(container);
        frame.setClosable(true);

        toUse.add(frame);
        frame.setLayer(JLayeredPane.MODAL_LAYER);

        frame.pack();
        frame.setVisible(true);

        return frame;
    }



    private static void startModal(JInternalFrame f) {
        // We need to add an additional glasspane-like component directly
        // below the frame, which intercepts all mouse events that are not
        // directed at the frame itself.
        JPanel modalInterceptor = new JPanel();
        modalInterceptor.setOpaque(false);
        JLayeredPane lp = JLayeredPane.getLayeredPaneAbove(f);
        lp.setLayer(modalInterceptor, JLayeredPane.MODAL_LAYER.intValue());
        modalInterceptor.setBounds(0, 0, lp.getWidth(), lp.getHeight());
        modalInterceptor.addMouseListener(new MouseAdapter(){});
        modalInterceptor.addMouseMotionListener(new MouseMotionAdapter(){});
        lp.add(modalInterceptor);
        f.toFront();

        // We need to explicitly dispatch events when we are blocking the event
        // dispatch thread.
        EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
        try {
            while (! f.isClosed())       {
                if (EventQueue.isDispatchThread())    {
                    // The getNextEventMethod() issues wait() when no
                    // event is available, so we don't need do explicitly wait().
                    AWTEvent ev = queue.getNextEvent();
                    // This mimics EventQueue.dispatchEvent(). We can't use
                    // EventQueue.dispatchEvent() directly, because it is
                    // protected, unfortunately.
                    if (ev instanceof ActiveEvent)  ((ActiveEvent) ev).dispatch();
                    else if (ev.getSource() instanceof Component)  ((Component) ev.getSource()).dispatchEvent(ev);
                    else if (ev.getSource() instanceof MenuComponent)  ((MenuComponent) ev.getSource()).dispatchEvent(ev);
                    // Other events are ignored as per spec in
                    // EventQueue.dispatchEvent
                } else  {
                    // Give other threads a chance to become active.
                    Thread.yield();
                }
            }
        }
        catch (InterruptedException ex) {
            // If we get interrupted, then leave the modal state.
        }
        finally {
            // Clean up the modal interceptor.
            lp.remove(modalInterceptor);

            // Remove the internal frame from its parent, so it is no longer
            // lurking around and clogging memory.
            Container parent = f.getParent();
            if (parent != null) parent.remove(f);
        }
    }
}
瞿和硕
2023-03-14

查看如何使用内部框架,并在showInternal上搜索。答案就在这里。

 类似资料:
  • 问题内容: 我如何使这个小功能“ imageExists”返回ajax请求是否成功? 问题答案: 我相信您将必须使用同步模式并使用单独的变量来存储返回值。

  • 问题内容: 这个问题已经在这里有了答案 : 如何从异步调用返回响应? (39个答案) 7年前关闭。 我想创建一个JavaScript函数,该函数返回jQuery AJAX调用的值。我想要这样的东西。 我知道我可以通过将async设置为false来做到这一点,但我宁愿不这样做。 问题答案: 使用jQuery 1.5,您可以使用全新的功能,正是为此目的而设计的。 资源

  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 问题内容: 我有一些jQuery代码。我已经调用了一个Ajax函数文件file.php,其中包含一些字段,例如: 我会再次分配给jQuery函数吗?如果是这样,我该怎么办?我附上了一个示例文件: 问题答案: 该函数采用一个参数,其中包含获取的数据。因此,在您的示例中: 更多示例在jQuery文档中。

  • 问题内容: 我对AngularJS相当陌生,并且从模态对话框服务返回数据时遇到问题。基本上,我复制了Dan Wahlin的服务http://weblogs.asp.net/dwahlin/archive/2013/09/18/building-an- angularjs-modal- service.aspx, 并从我的控制器调用它。 然后我有我的部分,像这样: 这个模态被这样调用: 所以我的问题

  • 我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作: