当它在JDialog之外时更改光标

时间:2014-09-29 10:01:46

标签: java swing jdialog

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

我的意思是当光标在对话框中时它看起来很正常,当它在对话框之外我想要更改光标以便用户知道主框架被阻挡,直到他关闭当前对话框

1 个答案:

答案 0 :(得分:0)

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

    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));
    }

这确实会成功更改窗口的光标属性,但是当模式对话框打开时,那些窗口的光标属性显然是忽略,它们始终显示默认箭头。我也尝试设置窗口各个组件的cursor属性,但是,一旦打开模式对话框,就会忽略cursor属性。

我在Windows上测试了这个。该行为很可能取决于平台,因此它可能适用于其他操作系统。

然而,即使它有效,我也想建议这样做并不是一个好主意。它无法克服用户对基本窗口和对话框工作方式的期望。操作系统已经有了自己的规则。例如,在Windows上,尝试与模式对话框阻止的窗口进行交互会发出哔声,并且模式对话框的标题栏会闪烁,这是很容易理解的行为。