使用方法时setCursor()
,要更改组件使用的光标,所有组件都可以正常工作,包括JFrame
and JDialog
.
这里的问题在于modal JDialog
。当鼠标处于inside对话框中,光标显示在右侧。但是,当鼠标移动时outside对话框中,光标被重新设置为操作系统默认值,即使底层JFrame
使用与对话框相同的自定义光标。
我搜索了很多,发现了一些相关的问题,但没有一个对此有正确的答案。
我使用的是 Windows 10; JDK 1.8.0_40。
SSCCE:
package br.shura.knockback;
import java.awt.Cursor;
import java.awt.Dimension;
import javax.swing.*;
public class DialogCursorSSCCE extends JFrame {
public DialogCursorSSCCE() {
Cursor cursor = new Cursor(Cursor.CROSSHAIR_CURSOR);
JButton button = new JButton("Click me to open dialog.");
button.addActionListener(event -> {
JDialog dialog = new JDialog();
JLabel label = new JLabel("Move the mouse outside this dialog.");
int width = label.getFontMetrics(label.getFont()).stringWidth(label.getText());
label.setPreferredSize(new Dimension(width + 10, 50));
dialog.add(label);
dialog.pack();
dialog.setCursor(cursor);
dialog.setLocationRelativeTo(button);
dialog.setModal(true);
dialog.setTitle("Dialog");
dialog.setVisible(true);
});
button.setAlignmentX(CENTER_ALIGNMENT);
button.setMaximumSize(new Dimension(400, 100));
setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
add(button);
setCursor(cursor);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setExtendedState(MAXIMIZED_BOTH);
setTitle("DialogCursorSSCCE");
}
public static void main(String[] args) {
new DialogCursorSSCCE().setVisible(true);
}
}
但是,当鼠标移出对话框时,光标将重新设置为操作系统默认值,
我对正在发生的事情的猜测是,对话框的边框是操作系统对等组件。因此,当您离开 Swing 组件时,会为操作系统对等方生成鼠标悬停事件,因此光标将设置为操作系统默认值。
当您完全离开对话框时,框架不会接收任何事件,因为对话框是模态的,因此系统光标在框架上时仍然显示。
注意当光标进入标题栏时光标如何变化。
现在尝试以下操作:
JDialog dialog = new JDialog();
dialog.setUndecorated(true);
dialog.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
现在,光标仅在到达边框时才会改变,因为 Swing 正在绘制标题栏。
我也尝试过:
JDialog dialog = new JDialog();
dialog.setUndecorated(true);
因此没有任何装饰,但光标离开窗口时仍然会发生变化。
我不知道有什么办法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)