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

  • 本文关键字:滞后 JPanel java swing lag
  • 更新时间 :
  • 英文 :


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

编辑:

buttonsPanel中有buttonbuttonsPanel被添加到具有作为rect的边界的JLayeredPane。当JLayeredPane或JButton buttonhovered时,将触发鼠标事件。然后,鼠标事件将计时器触发为slide the 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的绘画引擎准备好之前,什么都不会发生。

事实上,如果你连续快速地重复调用重新绘制,你会发现自己的请求充斥着绘制引擎,甚至会进一步减慢速度。

虽然它不能解决整个问题,但它会让你的生活变得简单得多——看看TimingFramework或Trident。

它们是"动画"框架,旨在消除猜测,让你的生活更轻松。我个人所有的动画都使用TimingFramework,效果很好。

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

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

事实上,如果你连续快速地重复调用重新绘制,你会发现自己的请求充斥着绘制引擎,甚至会进一步减慢速度。

我认为这才是真正的问题。尝试将计时器事件之间的延迟从1增加到10-50,它应该会运行得更好。

关于如何构建这些(以及许多其他)效果,我只能推荐《肮脏的富有客户》一书。在这个页面上,你还可以找到很多书中处理这些效果的例子。

最新更新