我对 Swing Timer 有疑问。我正在尝试为按下按钮时从侧面滑入的 JPanel 创建“滑动”动画。这实际上工作正常,但是当我想让它再次滑出时,我的表现极差。注意:JPanel位于 JLayeredPane 中,其下还有其他组件(这一点很重要)。
以下是幻灯片的代码:
int boundsTo = GlobalValue.getLargeInformationBarWidth();
final int[] boundsNow = {0};
inSlideTimer = new Timer(1, ae -> {
if (boundsTo > boundsNow[0]){
boundsNow[0] = boundsNow[0] + 3;
JourneyPlannerBarController.getInstance().getInformationBar().setBounds(0, 0, boundsNow[0], window.getFrame().getHeight());
JourneyPlannerBarController.getInstance().getInformationBar().revalidate();
JourneyPlannerBarController.getInstance().getInformationBar().repaint();
} else {
inSlideTimer.stop();
inSlideTimer = null;
}
});
inSlideTimer.start();
JourneyPlannerBarController.getInstance().setupLargeJourneyPlannerBar();
}
以下是幻灯片的代码:
int boundsTo = 0;
final int[] boundsNow = {GlobalValue.getLargeInformationBarWidth()};
inSlideTimer = new Timer(1, ae -> {
if (boundsTo <= boundsNow[0]) {
boundsNow[0] = boundsNow[0] - 3;
JourneyPlannerBarController.getInstance().getInformationBar().setBounds(0, 0, boundsNow[0], window.getFrame().getHeight());
JourneyPlannerBarController.getInstance().getInformationBar().revalidate();
JourneyPlannerBarController.getInstance().getInformationBar().repaint();
} else {
inSlideTimer.stop();
inSlideTimer = null;
JourneyPlannerBarController.getInstance().clearJourneyPlannerBar();
CanvasController.repaintCanvas();
}
});
inSlideTimer.start();
}
可以看出,两个代码块几乎完全相同,但性能差异确实很大。我一直试图阅读SwingWorker,EDT等等,但到目前为止我还没有找到任何可以帮助我的东西。