[英]Custom Cursor in a Swing JDialog
I have a Java Swing application, developed on Mac OS X 10.5 using Java 1.5. 我有一个Java Swing应用程序,使用Java 1.5在Mac OS X 10.5上开发。
I'm trying to make a custom cursor appear when the user moves the mouse over some text in a dialog. 当用户将鼠标移动到对话框中的某些文本时,我正在尝试使用自定义光标。 The cursor never changes, though.
但是,光标永远不会改变。
When I don't use a JFrame instead of a JDialog, the cursor does change. 当我不使用JFrame而不是JDialog时,光标确实会改变。 But then I'll have to write all the dialog code myself.
但是我必须自己编写所有的对话框代码。
How can I get the cursor to appear? 如何让光标出现?
Here's the simplest code I could create to demonstrate the problem: 这是我可以创建的最简单的代码来演示问题:
import javax.swing.*;
import java.awt.*;
public class CursorTest {
public static void main(String[] args) {
JLabel label = new JLabel("Move mouse here for hand cursor");
label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JOptionPane pane = new JOptionPane(label);
pane.setOptions(new Object[]{"OK"});
JDialog dialog = pane.createDialog(null, "Test Dialog");
dialog.setVisible(true);
}
}
Looks like it is a bug in Java 1.5: I first tried with Java 1.6.0_07 and it worked as expected (on Windows XP). 看起来它是Java 1.5中的一个错误:我首先尝试使用Java 1.6.0_07并且它按预期工作(在Windows XP上)。 Then I recompiled with Java 1.5.0_06 and indeed the cursor remains in default state.
然后我用Java 1.5.0_06重新编译,确实光标仍处于默认状态。
Knowing the difficulties of Java 1.6 on MacOS, I see it will be hard to fix that... 知道MacOS上Java 1.6的困难,我发现很难解决这个问题......
Bug ID: 5079694 JDialog doesn't respect setCursor 错误ID:5079694 JDialog不尊重setCursor
They give a workaround... 他们给出了解决方法......
[EDIT] Tested workaround: [编辑]经过测试的解决方法:
public class CursorTest extends JFrame
{
private CursorTest()
{
}
private void ShowDialog()
{
JLabel label = new JLabel("Move mouse here for hand cursor");
label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JOptionPane pane = new JOptionPane(label);
pane.setOptions(new Object[] { "OK" } );
JDialog dialog = pane.createDialog(this, "Test Dialog");
dialog.setVisible(true);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
CursorTest testFrame = new CursorTest();
testFrame.setTitle("Test GUI");
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testFrame.setSize(500, 300);
testFrame.setVisible(true);
testFrame.ShowDialog();
}
});
}
}
Works fine with my JDK & system. 适用于我的JDK和系统。
Thanks PhiLho, that Sun bug report gave me the solution. 感谢PhiLho,Sun bug报告给了我解决方案。 The owner (parent frame) must be non-null and showing.
所有者(父框架)必须为非null并显示。 For the record, here's a modified version of my example code that does show a hand cursor.
为了记录,这里是我的示例代码的修改版本,它确实显示了手形光标。
import javax.swing.*;
import java.awt.*;
public class CursorTest {
public static void main(String[] args) {
JLabel label = new JLabel("Move mouse here for hand cursor");
label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
JOptionPane pane = new JOptionPane(label);
pane.setOptions(new Object[]{"OK"});
JFrame parent = new JFrame();
parent.setVisible(true);
JDialog dialog = pane.createDialog(parent, "Test Dialog");
dialog.setModal(false);
dialog.setVisible(true);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.