我有一个问题。我想制作一个摇摆形式,当点击一个按钮时,他将一个面板(带有他的内容)向左滑动,这样右边的面板就会取代它,效果很流畅。
我试过一段时间来检查面板的大小,然后将其最小化并显示下一个这样的:
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
答案 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(请查看链接)。