在Java上的JForm中滑动JPanel内容

时间:2011-02-21 17:26:45

标签: java swing jpanel slide effect

我有一个问题。我想制作一个摇摆形式,当点击一个按钮时,他将一个面板(带有他的内容)向左滑动,这样右边的面板就会取代它,效果很流畅。

我试过一段时间来检查面板的大小,然后将其最小化并显示下一个这样的:

    while (jpanelprincipal1.getWidth() < 439 || jpanelprincipal1.getHeight() > 250)
    {
        int panel1width = jpanelprincipal1.getWidth();
        int panel2height = jpanelprincipal1.getHeight();
        jpanelprincipal1.setSize(panel1width -- , panel2height --);
        jpanelprincipal2.setSize(440,250);
    }

我在C#中使用了这个技巧但是使用了Application.DoEvent(); (显然它在java上不可用)。

无论如何我可以制作2个或更多面板的幻灯片效果吗?

顺便说一句:对不起,我的英语非常糟糕!

先谢谢, Luis Da Costa

3 个答案:

答案 0 :(得分:6)

根据@HFOE的建议,javax.swing.Timer是动画的不错选择。可以从ActionListener调用setDividerLocation() JSplitPane方法。有关其他选项,请参阅How to Use Split Panes

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

/** @see http://stackoverflow.com/questions/5069152 */
public class SplitPaneTest {

    double ratio = 0.5;
    double delta = ratio / 10;
    private void create() {
        JFrame f = new JFrame("JSplitPane");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyPanel p1 = new MyPanel(Color.red);
        MyPanel p2 = new MyPanel(Color.blue);
        final JSplitPane jsp = new JSplitPane(
            JSplitPane.HORIZONTAL_SPLIT, true, p1, p2);
        Timer timer = new Timer(200, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                ratio += delta;
                if (ratio >= 1.0) {
                    ratio = 1.0;
                    delta = -delta;
                } else if (ratio <= 0) {
                    delta = -delta;
                    ratio = 0;
                }
                jsp.setDividerLocation(ratio);
            }
        });

        f.add(jsp);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        timer.start();
    }


    private static class MyPanel extends JPanel {

        Color color;

        public MyPanel(Color color) {
            this.color = color;
            this.setPreferredSize(new Dimension(300, 300));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(color);
            g.drawLine(0, 0, getWidth(), getHeight());
            g.drawLine(getWidth(), 0, 0, getHeight());
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new SplitPaneTest().create();
            }
        });
    }
}

答案 1 :(得分:6)

  

他将一个面板(带有他的内容)向左滑动,因此右边的面板取代了平滑的效果

您提到您希望面板“滑动”的问题,但是代码看起来像是在尝试让面板“缩小”,因此它会被另一个面板替换。

假设您有两个面板,每个面板都有相同的尺寸,那么您可以将一个面板“滑动”出另一个面板而另一个面板滑入视图。

为此,您可以使用带有GridLayout的面板。这样每个组件的大小都相同。然后将面板添加到滚动窗格中,而不使用任何滚动条。滚动窗格的大小需要设置为第一个compnoent的大小。然后,您可以通过更改视口的位置来“滑动”两个面板。因此,在你的计时器中你会得到类似的代码:

JViewport viewport = scrollPane.getViewport();
Point position = viewport.getViewPosition();
position.x += 5;
viewport.setViewPosition( position );

当位置大于组件的大小时,您将停止计时器。

答案 2 :(得分:4)

我可能会用Swing Timer做到这一点。在计时器的ActionListener中更改表示滑动JPanel的x,y位置的类字段,然后在持有JPanels的容器上调用repaint。 JLayeredPane可以很好地作为滑动JPanels的容器。

编辑1:关于您的代码请求,我认为最好的办法是尝试创建一个非常小的可编译的可运行程序,尝试执行此操作,然后发布代码,并解释您的程序的行为编辑原始帖子。同时向我们发送评论以通知我们您的更改。然后我们可以检查您的代码,测试它,修改它,并帮助您将其转化为工作程序。这称为创建“Short, Self Contained, Correct (Compilable), Example”或SSCCE(请查看链接)。