Warum verzögert sich der Sliding-Effekt auf meinem JPanel manchmal?
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);
}
}
}
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.