gpt4 book ai didi

java - 为什么我的 JPanel 上的滑动效果有时会滞后?

转载 作者:行者123 更新时间:2023-11-30 05:52:27 25 4
gpt4 key购买 nike

我正在使用 Timer 更改 JPanel 的边界,以便在有人将鼠标悬停在特定矩形区域上时获得滑动效果,这按预期工作。 JPanel 中有按钮,它们具有不同的 MouseEvent 行为。但有时它开始滞后或滑动得非常慢。拜托,任何人都可以建议我该怎么做,以确保它每次都表现良好?

已编辑:

buttonsPanel 中有 buttonbuttonsPanel 被添加到 JLayeredPane 中,它的边界为 rect。当 JLayeredPane 或 JButton buttonhovered 时触发鼠标事件。然后鼠标事件触发计时器滑动 buttonsPanel 并显示它。

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);
}
}
}

最佳答案

主要问题是您假设您可以控制绘制引擎。实际上,您不需要,绘画引擎受操作系统的支配。这意味着您可以随心所欲地上下跳跃,但在操作系统和 Java 的绘制引擎准备就绪之前,什么都不会发生。

事实上,如果您快速连续地重复调用 repaint,您会发现自己用大量请求淹没了绘制引擎,进一步减慢了它的速度。

虽然不能解决所有问题,但它会让您的生活变得更加简单,请查看 TimingFrameworkTrident .

它们是“动画”框架,旨在消除猜测工作并让您的生活更轻松。我个人使用 TimingFramework 制作我的所有动画,效果很好。

随着时间的推移,计时框架以 % 的速度工作。也就是说,你给它一个周期的时间,框架将根据它们在该周期中的距离返回一个 % 值。您可以应用插值,从而影响动画部分的播放速度。

Trident 还被设计为提供代表您调用其他方法的方法,因此它可以根据您提供的值为您设置按钮 Pane 的边界。

关于java - 为什么我的 JPanel 上的滑动效果有时会滞后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11663193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com