gpt4 book ai didi

java - Java中的简单动画

转载 作者:行者123 更新时间:2023-12-01 06:38:39 27 4
gpt4 key购买 nike

我正在尝试在 Java Swing 应用程序中编写一个简单的动画或物理示例。我打开了实际的 Windows 应用程序并正在运行,但我不知道如何实际绘制我的形状,以及如何格式化框架之间的计算代码,诸如此类的东西。

我读过一些关于覆盖绘制方法的内容,但我不知道这意味着什么,而且我不相信我在现在使用的代码中使用它。这是我的代码:

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

谢谢!

最佳答案

"I've read some stuff about over riding a paint method, but I don't know what that means"

所以你已经覆盖了 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 。在上面链接的教程中,一些示例将使用小程序并覆盖 paint ,但您不应该在顶级容器上绘画,例如 JFrameJApplet 。而是在 JPanel 上绘画或JComponent只需添加 JFrame 。当您在 JPanel绘画时或JComponent ,您将覆盖 paintComponent (它也会沿着油漆链被调用),而不是 paint

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(x, y, width, height);
}

您可以看到我如何使用 drawOval 的变量方法。 x是距屏幕顶部的 x 位置,y和 y 点。 widthheight是圆的宽度和高度。使用变量的好处是它们的值可以在运行时更改。

这就是动画发挥作用的地方。正如所指出的,您可以使用 javax.swing.Timer

基本结构是

public Timer(int delay, ActionListener listener) {
}

delay是对监听器的每次调用延迟的毫秒数。听众将得到您的 actionPerformed回调将执行内部操作,每个 delay毫秒。所以你能做的就是改变 x来自drawOvalrepaint() ,并且它会动画。类似的东西

Timer timer = new Timer(40, new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
x += 5;
repaint();
}
});
timer.start();

您可以将计时器代码放入构造函数中。这可能是我能给出的最简单的解释。希望能帮助到你。

别忘了看看Custom PaintingGrapics2D有关图形的更多高级主题。另请参阅计时器和动画的一些示例 hereherehereherehere

<小时/>

还要避免使用空布局。请参阅Laying out Components Within a Container了解如何使用布局管理器,就像使用 Swing 应用程序一样。

关于java - Java中的简单动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22649374/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com