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

Java 为什么我的JPanel上的滑动效应有时会滞后?,java,swing,lag,Java,Swing,Lag,我正在使用计时器更改JPanel的边界,以便在有人悬停在特定矩形区域上时获得滑动效果,这是按预期工作的。JPanel中有一些按钮,它们具有不同的MouseEvent行为。但有时它开始滞后或滑动非常缓慢。请问,有谁能建议我该怎么做,以确保它每次都表现良好 编辑: 按钮面板中有按钮按钮面板被添加到一个JLayeredPane中,其边界为rect。当JLayeredPane或JButton按钮处于悬停状态时,会触发鼠标事件。然后,鼠标事件触发计时器滑动按钮面板并将其显示在视图中 class MyAct

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

编辑:

按钮面板
中有
按钮
<代码>按钮面板
被添加到一个
JLayeredPane
中,其边界为
rect
。当JLayeredPane或JButton
按钮处于
悬停状态时,会触发鼠标事件。然后,鼠标事件触发计时器滑动按钮面板并将其显示在视图中

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的绘图引擎准备就绪之前,一切都不会发生

事实上,如果您快速连续地重复调用repait,您会发现自己的绘制引擎中充满了请求,从而进一步降低了绘制速度

虽然这并不能解决整个问题,但它会让你的生活变得简单得多。看看手术室吧

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

随着时间的推移,计时框架以%的速度工作。也就是说,你给它一个周期的时间,框架将返回一个%的值,这个值取决于它们在这个周期中走了多远。可以应用插值,从而影响动画部分的播放速度

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

事实上,如果您快速连续地重复调用repait,您会发现自己的绘制引擎中充满了请求,从而进一步降低了绘制速度

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


关于构建这些(以及许多其他)效果的很多方法,我只能推荐这本书。在这一页上,你还可以找到很多关于书中处理的效果的例子。

对不起,坏名字。。。那就是JPanel,里面有按钮。你能告诉我你在哪里创建gui吗?也许是主要的方法。谢谢,这很有帮助,但是使用另一个框架来完成一个简单的任务看起来需要做很多工作。但我现在知道原因了,这才是更重要的。我按照罗兰的建议增加了计时器延迟,虽然它不像以前那么平滑(不是什么大问题),但现在性能是一致的。我将帧和延迟改为10,它工作了。谢谢。我一定会买那本书。