java wait problème d'affichage du curseur

Je vais avoir des problèmes d'affichage d'un curseur d'attente dans mon application. Chaque fois que la souris est au-dessus d'un panneau qui définit son propre curseur, le curseur d'attente n'apparaît pas. Si un groupe ne change pas le curseur, le curseur d'attente s'affiche.

Je joins une SSCE avec précision expliquer mon problème.

public class BusyCursorTest extends javax.swing.JFrame {
public BusyCursorTest() {
javax.swing.JMenuBar menuBar = new javax.swing.JMenuBar();
javax.swing.JMenu menu = new javax.swing.JMenu("Menu");
javax.swing.JMenuItem wait1 = new javax.swing.JMenuItem("Wait 100 ms");
javax.swing.JMenuItem wait2 = new javax.swing.JMenuItem("Wait 250 ms");
javax.swing.JMenuItem wait3 = new javax.swing.JMenuItem("Wait 500 ms");
javax.swing.JMenuItem wait4 = new javax.swing.JMenuItem("Wait 1000 ms");
menu.add(wait1);
menu.add(wait2);
menu.add(wait3);
menu.add(wait4);
menuBar.add(menu);
setJMenuBar(menuBar);
wait1.addActionListener(getActionListener(this, delayActionListener(100)));
wait2.addActionListener(getActionListener(this, delayActionListener(250)));
wait3.addActionListener(getActionListener(this, delayActionListener(500)));
wait4.addActionListener(getActionListener(this, delayActionListener(1000)));
cursorPanel = new javax.swing.JPanel();
cursorPanel.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseEntered(java.awt.event.MouseEvent e) {
cursorPanel.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.CROSSHAIR_CURSOR));
}
public void mouseExited(java.awt.event.MouseEvent e) {
cursorPanel.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.DEFAULT_CURSOR));
}
});
javax.swing.JTabbedPane tabbedPane = new javax.swing.JTabbedPane();
tabbedPane.addTab("Default", new javax.swing.JPanel());
tabbedPane.addTab("Cursor change", cursorPanel);
getContentPane().add(tabbedPane);
setTitle("Cursor test");
setSize(400, 400);
setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
setVisible(true);
}
private java.awt.event.ActionListener delayActionListener(final int delay) {
java.awt.event.ActionListener listener = new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent ae) {
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
}
}
};
return listener;
}
public static void main(String[] args) {
new BusyCursorTest();
}
public static java.awt.event.ActionListener getActionListener(final java.awt.Component component,
final java.awt.event.ActionListener originalActionListener) {
java.awt.event.ActionListener actionListener = new java.awt.event.ActionListener() {
public void actionPerformed(final java.awt.event.ActionEvent e) {
java.util.TimerTask timerTask = new java.util.TimerTask() {
public void run() {
originalCursor = component.getCursor();
component.setCursor(java.awt.Cursor.getPredefinedCursor(java.awt.Cursor.WAIT_CURSOR));
}
};
java.util.Timer timer = new java.util.Timer();
try {
timer.schedule(timerTask, DELAY_MS);
originalActionListener.actionPerformed(e);
} finally {
timer.cancel();
component.setCursor(originalCursor);
}
}
};
return actionListener;
}
private javax.swing.JPanel cursorPanel = null;
public static java.awt.Cursor originalCursor = null;
public static final int DELAY_MS = 250;
}

Exécuter le joint SSCE.

Lorsque le premier onglet ("Default") est sélectionné, en cliquant sur les 1000ms élément de menu afficher le curseur occupé.

Lorsque le deuxième onglet ("Curseur change") est sélectionné, en cliquant sur les 1000ms élément de menu ne s'affiche pas le curseur occupé.

Comment dois-je remédier à ce problème?

Je préfère que mon code n'ont pas à tenir compte de ces panneaux, qu'il est extrêmement difficile pour moi de garder une trace des panneaux peut être à l'avant-garde. Aussi, les événements ne sont pas toujours dues à un clic de souris.

Quelle est la solution recommandée pour que je puisse modifier le comportement au conteneur de niveau supérieur?

source d'informationauteur Santosh Tiwari