我试图在Java Swing应用程序中编写一个简单的动画或物理示例。我有实际的Windows应用程序打开和工作,但我无法弄清楚如何实际绘制我的形状,以及我如何格式化帧之间的计算代码,这种东西。
我已经阅读了一些关于过油漆方法的内容,但我不知道这意味着什么,我也不相信我在代码中使用它#&# 39;我现在正在使用。这是我的代码:
public class Physics extends JFrame{
public Physics() {
initUI();
}
private void initUI() {
JPanel panel = new JPanel();
getContentPane().add(panel);
panel.setLayout(null);
final JLabel label = new JLabel("Hi, press the button to do something");
label.setBounds(20, 0, 2000, 60);
final JButton submitButton = new JButton("Start");
submitButton.setBounds(20, 150, 80, 20);
submitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//Put button code here later
}
});
panel.add(label);
panel.add(submitButton);
setTitle("Program");
setSize(300, 250);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Physics ex = new Physics();
ex.setVisible(true);
}
});
}
}
所以我的按钮上方有一些空白区域,我想在屏幕上画一个正方形或圆形开始,一旦我把它弄下来,我就可以开始进入更高级的东西了。关于如何做到这一点的任何提示都会受到关注:D
谢谢!
答案 0 :(得分:4)
查看Custom Painting上的Swing教程。
该示例向您展示如何进行绘画。如果您想要动画,那么您可以使用Swing Timer
来安排动画。本教程还有一个关于How to use a Swing Timer
的部分。
将两个教程放在一起,你就有了解决方案。
答案 1 :(得分:3)
“我读过一些关于过油漆方法的东西,但我不知道这意味着什么”
所以你已经覆盖了actionPerformed
,所以你知道@Override
是什么。正如您从ActionListener
注意到的那样,您从未实际明确地调用actionPerformed
,但无论您放在那里,仍然可以使用它。那是因为ActionListener
隐含地为你调用它。
绘画也是如此。在Swing绘画过程中,Swing使用一个绘画链来绘制组件。一路上paint
被称为某处。就像actionPerformed
一样,您可以覆盖paint
,它会被隐式调用。
@Override
public void paint(Graphics g) {
super.paint(g);
}
传递给方法的Graphics
对象是Swing将用于绘画的图形上下文。您可以查看Graphics API
以查看可以使用的方法。您可以使用drawOval
绘制圆圈
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawOval(x, y, width, height);
}
现在就是这样。您实际上并不想覆盖paint
。在上面链接的教程中,一些示例将使用applet并覆盖paint
,但您不应该在顶级容器上绘制,如JFrame
或JApplet
。而是在JPanel
或JComponent
上绘画,然后将其添加到JFrame
。当您在JPanel
或JComponent
上进行 绘制时,您将覆盖paintComponent
(也会在绘制链中调用),而不是{{1 }}
paint
您了解我如何使用@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(x, y, width, height);
}
方法的变量。 drawOval
是屏幕顶部的x位置,x
和y点。 y
和width
是圆的宽度和高度。使用变量的好处是它们的值可以在运行时更改。
这就是动画发挥作用的地方。如上所述,您使用javax.swing.Timer
基本构造是
height
public Timer(int delay, ActionListener listener) {
}
是延迟每次调用侦听器的毫秒数。监听器将使用delay
回调,每隔actionPerformed
毫秒执行内部操作。所以你可以做的只是从delay
和x
更改drawOval
,它会动画。像
repaint()
您可以在构造函数中放入的计时器代码。这可能是我能给出的最简单的解释。希望能帮助到你。
不要忘记查看Custom Painting和Grapics2D以获取有关图形的更多高级主题。另请参阅计时器和动画here以及here和here以及here和here
的示例还要避免使用null布局。请参阅Laying out Components Within a Container以了解如何使用布局管理器,就像使用Swing应用程序一样。
答案 2 :(得分:2)
有很多方法可以达到这个目的。
首先看看:
有关如何在Swing中完成绘画的详细信息。
动画不仅仅是暂停一小段时间然后重新绘制,加速和减速以及其他需要考虑的概念。
虽然您可以编写自己的,但这不是一项小任务,但更好的解决方案可能是使用预先存在的引擎,例如......
然后看看:
这些都是Swing中动画引擎的例子。虽然我更喜欢时序框架,因为它为我提供了一个较低级别的API,这是个人意见。 Trident和JUWE似乎都更倾向于基于组件/属性的动画(如果你想构建一些功能集,Timing Framework可以做到这一点)
答案 3 :(得分:1)
我制作了一个简单的动画,两个火箭爆炸了。完整的日食项目在这里:https://github.com/CoachEd/JavaExamples/tree/master/RaceToSpace。这是一个截图: