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);
        }
    }
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top