【问题标题】:Change cursor when it is outside of JDialog当光标在 JDialog 之外时更改光标
【发布时间】:2014-09-29 10:01:45
【问题描述】:

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

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

【问题讨论】:

  • “阻止其他帧” 这些其他 JFrame 对象是由您的代码创建的,其他应用程序。在系统上,还是别的什么?为了尽快获得更好的帮助,请发布MCVE(最小完整可验证示例)。
  • 不,是我在应用程序中创建的框架
  • 对不起,这不是我要找的。我只是想知道光标图标在 JDialog 内部和外部时如何更改
  • “这不是我要找的。” 这就是为什么我没有输入它作为答案,但只要你解决这个问题并发布一个 MCVE剩下的问题我会多注意的。

标签: java swing jdialog


【解决方案1】:

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

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

这确实成功地改变了窗口的光标属性,但是当模式对话框打开时,这些窗口的光标属性显然被忽略并且它们总是显示一个默认箭头。我也尝试设置窗口各个组件的光标属性,但同样,一旦打开模式对话框,光标属性就会被忽略。

我在 Windows 上对此进行了测试。该行为很可能与平台相关,因此它可能适用于其他操作系统。

但是,即使它有效,我也想建议这样做不是一个好主意。违背用户对基本窗口和对话框如何工作的期望可能会造成混乱。操作系统已经为此制定了自己的规则。例如,在 Windows 上,尝试与被模态对话框阻止的窗口进行交互会导致发出哔声,并且模态对话框的标题栏会闪烁,这是众所周知的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    相关资源
    最近更新 更多