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
Vous devez vous connecter pour publier un commentaire.
hmmm vous code avoir de problème avec Concurency en Swing il y a deux zones
remplacer le Fil de discussion.sommeil(retard); et java.util.Minuterie avec java.swing.Minuterie parce que bloc HAE
mais dans d'autres mains, il y a une façon de volontairement bloquer EDT (par splungebob de OTN)
REMARQUE: cet exemple à l'encontre de tous les Swing rulles, et fonctionne sous cette forme et que l'exemple
Essayez de vous fixer sur le cadre au lieu d'un composant donné