Pourquoi l'effet Sliding sur mon JPanel est-il parfois en retard ?
Question
Je change les limites d'un JPanel
utilisant un Timer
pour obtenir un effet de glissement lorsque quelqu'un survole une zone rectangulaire particulière, cela fonctionne comme prévu.Il y a des boutons dans le JPanel
et ils ont différents MouseEvent
comportements.Mais PARFOIS il commence à prendre du retard ou glisse très lentement.S'il vous plaît, quelqu'un peut-il suggérer ce que je peux faire pour garantir qu'il fonctionne bien à chaque fois ?
ÉDITÉ:
Le buttonsPanel
avoir button
dedans. buttonsPanel
est ajouté à un JLayeredPane
qui ont des limites comme rect
.Lorsque JLayeredPane ou JButton button
est hovered
les événements de souris sont déclenchés.Les événements de la souris déclenchent ensuite la minuterie slide the buttonsPanel
et lui apporter une vue.
class MyActionListener implements ActionListener {
private static final int frames = 50;
int count = 0;
private final Timer timer = new Timer(1, this);
public void start() {
timer.start();
}
@Override
public void actionPerformed(ActionEvent ae) {
if (count >= frames) {
timer.stop();
} else {
count = count + 1;
buttonsPanel.setBounds(hidden_width - hidden_width * count / frames, 0, hidden_width, frameHeight);
}
}
}
class MyMouseListener extends MouseAdapter {
private MyActionListener timerListener;
@Override
public void mouseEntered(final MouseEvent event) {
final Color color = new Color(50, 50, 50);
if (event.getSource() instanceof JButton) {
final JButton button = (JButton) event.getSource();
button.setBackground(color);
buttonsPanel.setVisible(true);
} else if (!buttonsPanel.isVisible()) {
buttonsPanel.setVisible(true);
timerListener = new MyActionListener();
timerListener.start();
}
}
@Override
public void mouseExited(final MouseEvent event) {
Point point = new Point(0, 0);
if (event.getSource() instanceof JButton) {
final JButton button = (JButton) event.getSource();
point = button.getLocation();
button.setBackground(Windows8GUI.color);
}
Rectangle rect = new Rectangle(0, 0, hidden_width, frameHeight);
if (!rect.contains(point.x + event.getX(), point.y + event.getY())) {
buttonsPanel.setVisible(false);
buttonsPanel.setBounds(0, 0, hidden_width, frameHeight);
}
}
}
La solution
Le principal problème est que vous supposez que vous contrôlez le moteur de peinture.En fait, ce n'est pas le cas, le moteur de peinture est à la merci du système d'exploitation.Cela signifie que vous pouvez sauter de haut en bas autant que vous le souhaitez, mais tant que le système d'exploitation et le moteur de peinture de Java ne seront pas prêts, rien ne se passera.
En fait, si vous appelez Repaint à plusieurs reprises et en succession rapide, vous pouvez vous retrouver à inonder le moteur de peinture de requêtes, le ralentissant encore davantage.
Bien que ce ne soit pas une solution à tout le problème, cela vous simplifiera grandement la vie. Cadre de timing ou Trident.
Ce sont des frameworks « d’animation » conçus pour éliminer les approximations et vous faciliter la vie.J'utilise personnellement TimingFramework
pour toutes mes animations et ça marche bien.
Les cadres de timing fonctionnent sur un% au fil du temps.Autrement dit, vous lui donnez une durée pour un cycle et les frameworks renverront une valeur en % en fonction de leur état d'avancement dans ce cycle.Vous pouvez appliquer des interpolations, ce qui vous permet d'influencer la vitesse de lecture d'une partie de l'animation.
Trident
a également été conçu pour fournir le moyen d'appeler d'autres méthodes en votre nom, afin de pouvoir définir les limites du volet de boutons pour vous, en fonction des valeurs que vous lui fournissez.
Autres conseils
En fait, si vous appelez Repaint à plusieurs reprises et en succession rapide, vous pouvez vous retrouver à inonder le moteur de peinture de requêtes, le ralentissant encore davantage.
Je pense que c'est le vrai problème.Essayez d'augmenter le délai entre les événements de la minuterie de 1 à 10-50 et cela devrait fonctionner beaucoup mieux.
Pour de nombreuses procédures permettant de créer ces effets (et bien d'autres), je ne peux que recommander le livre Clients riches et sales.Sur cette page, vous trouverez également de nombreux exemples des effets traités dans le livre.