Java 阻止用户单击当前帧以外的其他位置的最佳方法?

Java 阻止用户单击当前帧以外的其他位置的最佳方法?,java,swing,user-interface,Java,Swing,User Interface,所以,我想知道,如何阻止用户退出或切换到应用程序中的另一个JFrame?我还没有代码,但这张图片应该足够清晰: 那些灰色的方块是JFrames。上面有数字2的框架位于顶部,我希望它保持这种状态,直到我以编程方式关闭它。任何像点击数字为1的帧或尝试在数字为2的帧外执行任何操作,都会导致再次关注数字为2的帧 第2帧中的逻辑步骤非常重要,因此我想确保用户将在该帧中填写from 谢谢你抽出时间 如注释中所述,使用将框架指定为所有者的模式对话框,用户将无法访问框架,直到该对话框被取消 import ja

所以,我想知道,如何阻止用户退出或切换到应用程序中的另一个JFrame?我还没有代码,但这张图片应该足够清晰:

那些灰色的方块是JFrames。上面有数字2的框架位于顶部,我希望它保持这种状态,直到我以编程方式关闭它。任何像点击数字为1的帧或尝试在数字为2的帧外执行任何操作,都会导致再次关注数字为2的帧

第2帧中的逻辑步骤非常重要,因此我想确保用户将在该帧中填写from


谢谢你抽出时间

如注释中所述,使用将框架指定为所有者的模式对话框,用户将无法访问框架,直到该对话框被取消

import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class BlockUserFromFrame {

    BlockUserFromFrame() {
        JFrame f = new JFrame("Try to access frame!");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JLabel l = new JLabel("Access frame after dialog disappears!");
        l.setBorder(new EmptyBorder(50, 100, 50, 100));
        f.add(l);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);

        // use a constructor that allows us to specify a parent and modality
        JDialog d = new JDialog(f, true);
        JLabel l1 = new JLabel("Dismiss dialog to access frame!");
        l1.setBorder(new EmptyBorder(20, 100, 10, 100));
        d.add(l1);
        d.pack();
        d.setLocationRelativeTo(f);
        d.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            BlockUserFromFrame o = new BlockUserFromFrame();
        };
        SwingUtilities.invokeLater(r);
    }
}

如注释中所述,使用将框架指定为所有者的模式对话框,在对话框关闭之前,用户将无法访问框架

import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class BlockUserFromFrame {

    BlockUserFromFrame() {
        JFrame f = new JFrame("Try to access frame!");
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JLabel l = new JLabel("Access frame after dialog disappears!");
        l.setBorder(new EmptyBorder(50, 100, 50, 100));
        f.add(l);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);

        // use a constructor that allows us to specify a parent and modality
        JDialog d = new JDialog(f, true);
        JLabel l1 = new JLabel("Dismiss dialog to access frame!");
        l1.setBorder(new EmptyBorder(20, 100, 10, 100));
        d.add(l1);
        d.pack();
        d.setLocationRelativeTo(f);
        d.setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            BlockUserFromFrame o = new BlockUserFromFrame();
        };
        SwingUtilities.invokeLater(r);
    }
}

如果某个窗口从
JDialog
(并设置为
modal
。您不能限制用户单击应用程序之外的任何其他位置。这假设所有窗口都是从同一个JVSEE生成的,以获取更多详细信息谢谢您的回答!因此,我应该从扩展JFrame切换到JDialog?是的,我需要限制关注另一个窗口。“我应该从扩展JFrame切换到JDialog?”代码应该使用一个
JFrame
和应用程序需要的尽可能多的
JDialog
窗口,但可能没有很好的理由扩展这两个类。如果从
JDialog
(并设置为
modal
。您不能限制用户单击应用程序之外的任何其他位置。这假设所有窗口都是从同一个JVSEE生成的,以获取更多详细信息谢谢您的回答!因此,我应该从扩展JFrame切换到JDialog?是的,我需要限制关注另一个窗口。”我应该从扩展JFrame切换到JDialog?”代码应该使用一个
JFrame
和应用程序需要的尽可能多的
JDialog
窗口,但可能没有很好的理由扩展这两个类。