Java 当光标位于JDialog之外时更改光标

Java 当光标位于JDialog之外时更改光标,java,swing,jdialog,Java,Swing,Jdialog,我正在创建一个Java应用程序,我想知道何时出现JDialog窗口并阻止其他帧,当光标图标位于对话框之外时,如何更改光标图标 我的意思是,当光标位于对话框内时,它将看起来正常;当光标位于对话框外时,我希望更改光标,以便用户知道主框架被阻止,直到他关闭当前对话框。这似乎不可能。我打算建议一个基本循环,它将迭代打开的窗口,并将对话框以外的所有窗口设置为不同的光标: JDialog dialog = new JDialog(ownerFrame, "dialog", true); // mod

我正在创建一个Java应用程序,我想知道何时出现JDialog窗口并阻止其他帧,当光标图标位于对话框之外时,如何更改光标图标


我的意思是,当光标位于对话框内时,它将看起来正常;当光标位于对话框外时,我希望更改光标,以便用户知道主框架被阻止,直到他关闭当前对话框。

这似乎不可能。我打算建议一个基本循环,它将迭代打开的窗口,并将对话框以外的所有窗口设置为不同的光标:

    JDialog dialog = new JDialog(ownerFrame, "dialog", true); // modal
    dialog.setLocationRelativeTo(ownerFrame);

    Cursor cursorInvalid;
    try {
        cursorInvalid = Cursor.getSystemCustomCursor("Invalid.32x32");
    } catch (HeadlessException | AWTException e) {
        throw new RuntimeException(e);
    }

    Map<Window,Cursor> previousCursors = new HashMap<>();
    for (Window w : Window.getWindows()) {
        if (w != dialog) {
            previousCursors.put(w, w.getCursor());
            w.setCursor(cursorInvalid);
        }
    }

    dialog.setVisible(true);

    for (Window w : Window.getWindows()) {
        w.setCursor(previousCursors.get(w));
    }
JDialog dialog=newjdialog(ownerFrame,“dialog”,true);//情态动词
对话框.setLocationRelativeTo(所有者框架);
光标光标光标无效;
试一试{
cursorInvalid=Cursor.getSystemCustomCursor(“无效的.32x32”);
}捕捉(无头异常| awtex异常){
抛出新的运行时异常(e);
}
Map previousCursors=新HashMap();
对于(窗口w:Window.getWindows()){
如果(w!=对话框){
put(w,w.getCursor());
w、 设置光标(cursorInvalid);
}
}
对话框.setVisible(true);
对于(窗口w:Window.getWindows()){
w、 setCursor(previousCursors.get(w));
}
这确实成功地更改了窗口的游标属性,但是当模式对话框打开时,这些窗口的游标属性显然被忽略,并且它们始终显示默认箭头。我还尝试设置窗口各个组件的cursor属性,但是,模式对话框一打开,cursor属性就会被忽略

我在Windows上测试了这个。这种行为很可能依赖于平台,因此它可能在其他操作系统上工作


然而,即使它能起作用,我还是想建议,这样做并不是一个好主意。违背用户对基本窗口和对话框工作方式的期望可能会带来混乱。操作系统已经有了自己的规则。例如,在Windows上,尝试与被模式对话框阻止的窗口进行交互时,会发出嘟嘟声,模式对话框的标题栏会闪烁,这是一种很好理解的行为。

“阻止其他帧”是由您的代码、其他应用程序创建的其他
JFrame
对象。在系统上,还是别的什么?为了更快地获得更好的帮助,请发布一个(最小完整的可验证示例)。不,这是我在应用程序中创建的框架。请参见抱歉,这不是我要找的。我只是想知道当光标图标位于JDialog内外时如何更改它“这不是我要找的”。这就是为什么我没有输入它作为答案,但一旦您解决了这个问题并发布了MCVE,我将更加关注问题的其余部分。