我是新手,使用java swing摆动和设计界面。我希望抽屉在按钮点击时拉出滑动动画。首先,是否可以这样做,如果是,我该怎么做。谢谢。我将非常感谢某些特定方法信息的回复。
根据您想要实现的目标,您可以通过多种方式实现这些目标。
基本的方法是简单地绘制graphics和Swing Timer
这将允许您简单地更新一个变量,该变量将作为绘制大小的基础,例如......
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class DrawerPaneTest {
public static void main(String[] args) {
new DrawerPaneTest();
}
public DrawerPaneTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new DrawerPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class DrawerPane extends JPanel {
private boolean drawIn = false;
private Timer timer;
private int drawWidth = 0;
private int drawDelta = 4;
public DrawerPane() {
addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
timer.stop();
drawIn = !drawIn;
drawDelta = drawIn ? 4 : -4;
timer.start();
}
});
timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
drawWidth += drawDelta;
if (drawWidth >= getWidth() / 2) {
drawWidth = getWidth() / 2;
timer.stop();
} else if (drawWidth < 0) {
drawWidth = 0;
timer.stop();
}
repaint();
}
});
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.drawRect(0, 0, drawWidth, getHeight());
g2d.dispose();
}
}
}
这是非常基本的,并没有考虑概念中的慢/慢等问题。对于那些,你最好看一个专门的动画框架,比如
您可能会使用哪些取决于您想要实现的目标,我个人喜欢Timing Framework,主要是因为它给了我很多自由,其中像Trident这样的东西(大多数)被设计为提供改变属性的能力例如,对象,例如大小或位置。虽然时间框架可以做到这一点,但需要更多的工作才能实现这一目标。
我没有使用过Universal Tween Engine,但是看过一些非常好的例子,比如Sliding-Layout,它实际上可能会满足你的需求......
首先,我认为你不应该使用Canvas
,因为,IMO,如果没有必要,你不应该将Swing的组件与AWT混合(我说的是你在GUI中放置的实际组件 - 我知道Swing建立在AWT之上。
您可能希望使用JPanel
并使用其paintComponent
方法执行自定义绘制。有很多这方面的教程(例如Lesson: Performing Custom Painting)。
一旦你弄清楚如何在JPanel
中绘制抽屉(只需使用Graphics2D
绘图),你就会想要为它制作动画:基本上,你只需要更新它的一些属性,很可能是某些位置......
你想要一些很好的缓和效果,一切都很容易处理和包装,我建议你去看看Universal Tween Engine。我已经使用过它,也可以帮助你。
将Universal Tween Engine库链接到项目后,只需使用以下调用:
Tween
.to(drawerProperties, Type.POSITION, 10.0f) // animate the POSITION property of your drawerProperties on 10.0 units of time
.target(100) // set the number of frames of that animation to
.ease(Quad.OUT) // set a nice quadratic effect on the animation
.start(tweenManager); // launch the animation
然后,在其他地方,你只需要运行Thread
,使用TweenManager
不断更新你的TweenManager#update
。
再一次,它看起来很多工作,但它实际上非常容易使用,而Universal Tween Engine的入门部分非常好。此外,如果你想真正为你的项目添加动画,这肯定是一个很好的工具使用:)
最后一点:您可能需要在Swing的事件调度线程中更新您的属性,具体取决于您的解决方案的具体实现方式。如果您对此知之甚少,可以阅读Lesson: Concurrency in Swing - 或者如果您有具体问题,只需搜索StackOverflow :)