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

时间:2012-07-26 05:52:08

标签: java swing lag

我正在使用JPanel更改Timer的范围,以便在有人悬停在特定矩形区域上时获得滑动效果,这是按预期工作的。 JPanel中有按钮,它们具有不同的MouseEvent行为。但 SOMETIMES 它开始滞后或滑动非常缓慢。请问,任何人都可以建议我能做些什么,以确保每次都表现良好?

编辑:

buttonsPanel中有buttonbuttonsPanel已添加到JLayeredPane,其范围为rect。当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);
        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

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

虽然不是整个问题的解决方案,但它会让您的生活变得更加简单,看看TimingFrameworkTrident

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

随着时间的推移,时间框架的工作效率为%。也就是说,你给它一个循环的时间,框架将根据它们的循环程度返回%值。您可以应用插值,从而可以影响动画的一部分播放速度。

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

答案 1 :(得分:3)

  

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

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

对于构建这些(以及许多其他)效果的大量方法,我只能推荐书籍Filthy Rich Clients。在这个页面上,你还可以找到很多关于书中处理的效果的例子。