在Java上的JForm中滑动JPanel内容

我有个问题。 我想做一个摇摆forms,当点击一个按钮时,他将一个面板(带有他的内容)向左滑动,所以右边的面板取代了它的平滑效果。

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

while (jpanelprincipal1.getWidth()  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

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

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

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

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

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

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

正如@HFOE所建议的那样, javax.swing.Timer是动画的不错选择。 可以从ActionListener调用JSplitPanesetDividerLocation()方法。 有关其他选项,请参见如何使用拆分窗格

 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(); } }); } } 

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

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