Пользовательский курсор в Swing JDialog
-
10-07-2019 - |
Вопрос
У меня есть приложение Java Swing, разработанное в Mac OS X 10.5 с использованием Java 1.5.
Я пытаюсь сделать так, чтобы пользовательский курсор появлялся, когда пользователь наводит указатель мыши на текст в диалоге. Курсор никогда не меняется, хотя. Р>
Когда я не использую JFrame вместо JDialog, курсор меняется. Но тогда мне придется написать весь код диалога самостоятельно.
Как я могу заставить курсор появляться?
Вот самый простой код, который я мог создать, чтобы продемонстрировать проблему:
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);
}
}
Решение
Похоже, что это ошибка в Java 1.5: я впервые попробовал с Java 1.6.0_07, и она работала как ожидалось (в Windows XP). Затем я перекомпилировал с Java 1.5.0_06, и курсор действительно остался в состоянии по умолчанию.
Зная о трудностях Java 1.6 в MacOS, я вижу, что это будет трудно исправить ...
Ошибка ID: 5079694 JDialog не уважает setCursor
Они дают обходной путь ...
[EDIT] Протестированный обходной путь:
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();
}
});
}
}
Отлично работает с моим JDK & amp; система.
Другие советы
Спасибо, PhiLho, тот отчет об ошибках Sun дал мне решение. Владелец (родительский фрейм) должен быть не нулевым и не показывать. Для записи вот модифицированная версия моего примера кода, который делает показывает курсор в виде руки.
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);
}
}