【问题标题】:Slide JPanel Content in a JForm on Java在 Java 上的 JForm 中滑动 JPanel 内容
【发布时间】:2011-07-01 10:44:43
【问题描述】:

我有一个问题。我想制作一个摆动形式,当点击一个按钮时,他将一个面板(包含他的内容)向左滑动,这样右边的面板就会用平滑的效果替换它。

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

    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 个或更多面板的幻灯片效果?

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

提前致谢, 路易斯·达科斯塔

【问题讨论】:

    标签: java swing jpanel slide effect


    【解决方案1】:

    他将一个面板(包含他的内容)向左滑动,这样右边的面板就会用平滑的效果代替它

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

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

    为此,您可以使用带有 GridLayout 的面板。这样每个组件的大小都相同。然后将面板添加到没有任何滚动条的滚动窗格中。滚动窗格的大小需要设置为第一个组件的大小。然后你可以通过改变视口的位置来“滑动”这两个面板。因此,在您的 Timer 中,您将编写如下代码:

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

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

    【讨论】:

    • 这将利用JScrollPane 实现中的任何优化。
    【解决方案2】:

    正如@HFOE 所建议的,javax.swing.Timer 是动画的不错选择。可以从ActionListener 调用JSplitPane 的setDividerLocation() 方法。有关其他选项,请参阅 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();
                }
            });
        }
    }
    

    【讨论】:

    • 不负责催眠视觉效果。 :-)
    【解决方案3】:

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

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

    【讨论】:

    • 感谢您的帮助,但最简单的方法是什么?使用 Swing Timer 或 JLayeredPane ?
    • 这两个概念并不相互排斥。我会使用 JLayeredPane 来保持滑动的 JPanel 和 Swing Timer 来制作动画——所以我会同时使用它们。查看有关这些人的 Swing 教程,您将了解它们是如何工作的。
    • Argh :S 即使在阅读了很多教程之后,幻灯片仍然存在问题:s 你能帮我一些代码吗?提前致谢
    • 见编辑 1。或者在这里尝试其他人的好建议。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多