问题
I am trying to setup a program that enables the user to display a transition when clicking the next and previous button. When pressing next, the swing timer should trigger and start the animation. When transitioning, there should be a flag that states it is in the transition period. The Swing timer should fire once every tenth of a second and essentially last 1 second.
public class guiCreation {
static Timer timer;
static boolean flag = false;
private static void guiInterface() {
next.addActionListener(new ActionListener(){
timer = new Timer(1000, this);
public void actionPerformed(ActionEvent e){
nextGest();
}
});
//should go to the next tab
previous.addActionListener(new ActionListener(){
//if the list gets to the beginning, disable button
public void actionPerformed(ActionEvent e){
prevGest();
}
});
}
public static void nextGest() {
timer.start();
previous.setEnabled(true);
next.setEnabled(true);
//if the list gets to the end, disable button
if (cardLayout.isNextCardAvailable()) {
status.setText(" Next button has been clicked");
//System.out.println("This is the" + size);
cardLayout.next(cardPanel);
next.setEnabled(cardLayout.isNextCardAvailable());
}
}
public static void prevGest() {
if (cardLayout.isPreviousCardAvailable()) {
timer.start();
next.setEnabled(true);
previous.setEnabled(true);
status.setText(" Previous button has been clicked");
cardLayout.previous(cardPanel);
previous.setEnabled(cardLayout.isPreviousCardAvailable());
}
}
}
回答1:
This: "The Swing timer should fire once every tenth of a second ..."
-- does not agree with this: timer = new Timer(1000, this);
Your Timer is firing once every second, not every 10th of a second.
Instead, you should:
- Create a
new Timer(100, ...)
, one that fires every 10th of a second - Store in an instance field the start time in msecs when the Timer begins (likely do this in your button's ActionListener)
- Within the Timer's ActionListener get the current mSecs and use this to check the elapsed time
- Stop the Timer via
((Timer) e.getSource()).stop();
once 1 full second has elapsed - No need for a flag, since all you need to do is to check if the Timer isn't null and if it
.isRunning()
. e.g.,if (timer != null && timer.isRunning()) {
-- then the animation is proceeding.
Unrelated suggestion:
- Get out of the static world and into the instance world. You're programming in Java, a language that is built to use OOPs from the ground up, and you don't want to fight against the OOPs paradigm.
来源:https://stackoverflow.com/questions/59122102/java-swing-creating-animation-using-swing-timer