Frage

Ich ändere die Grenzen von a JPanel Verwendung einer Timer Um einen Gleiteffekt zu erzielen, wenn jemand über einen bestimmten rechteckigen Bereich schwebt, funktioniert dies wie erwartet.Es gibt Knöpfe in der JPanel und sie haben verschiedene MouseEvent Verhaltensweisen.Aber MANCHMAL es beginnt zu stagnieren oder gleitet sehr langsam.Kann mir bitte jemand vorschlagen, was ich tun kann, um sicherzustellen, dass es jedes Mal gut funktioniert?

BEARBEITET:

Der buttonsPanel haben button drin. buttonsPanel wird zu a hinzugefügt JLayeredPane die Grenzen haben als rect.Wenn JLayeredPane oder JButton button Ist hovered Mausereignisse werden ausgelöst.Mausereignisse lösen dann den Timer aus slide the buttonsPanel und bringen Sie dazu Ansicht.

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);
        }
    }
}
War es hilfreich?

Lösung

Das Hauptproblem besteht darin, dass Sie davon ausgehen, dass Sie die Kontrolle über die Mal-Engine haben.Tatsächlich ist die Paint-Engine dem Betriebssystem ausgeliefert.Das bedeutet, dass Sie nach Belieben auf und ab springen können, aber bis das Betriebssystem und die Java-Mal-Engine bereit sind, passiert nichts.

Wenn Sie repaint wiederholt und schnell hintereinander aufrufen, kann es sogar passieren, dass die Paint-Engine mit Anfragen überschwemmt wird, was sie noch weiter verlangsamt.

Auch wenn es keine Lösung des gesamten Problems ist, wird es Ihr Leben erheblich einfacher machen. Schauen Sie sich das an TimingFramework oder Dreizack.

Dabei handelt es sich um „Animations“-Frameworks, die Ihnen das Rätselraten ersparen und Ihnen das Leben erleichtern sollen.Ich persönlich nutze TimingFramework für alle meine Animationen und es funktioniert gut.

Die Timing-Frameworks arbeiten mit einem %-Wert im Laufe der Zeit.Das heißt, Sie geben ihm eine Zeit für einen Zyklus vor und die Frameworks geben einen %-Wert zurück, der darauf basiert, wie weit sie sich in diesem Zyklus befinden.Sie können Interpolationen anwenden und so beeinflussen, wie schnell ein Teil der Animation abgespielt wird.

Trident wurde auch entwickelt, um die Möglichkeit zu bieten, andere Methoden in Ihrem Namen aufzurufen, sodass die Grenzen des Schaltflächenbereichs basierend auf den von Ihnen angegebenen Werten für Sie festgelegt werden können.

Andere Tipps

Wenn Sie repaint wiederholt und schnell hintereinander aufrufen, kann es sogar passieren, dass die Paint-Engine mit Anfragen überschwemmt wird, was sie noch weiter verlangsamt.

Ich denke, das ist das eigentliche Problem.Versuchen Sie, die Verzögerung zwischen den Timer-Ereignissen von 1 auf 10-50 zu erhöhen, dann sollte es viel besser laufen.

Für viele Anleitungen zum Erstellen dieser (und vieler anderer) Effekte kann ich das Buch nur empfehlen Schmutzig reiche Kunden.Auf dieser Seite finden Sie auch viele Beispiele für die im Buch behandelten Effekte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top