gpt4 book ai didi

Java:使用 Swing 的安全动画

转载 作者:搜寻专家 更新时间:2023-10-31 19:35:16 25 4
gpt4 key购买 nike

我正在创建一个使用 JFrame、JPanel、JLabel 和所有其他类型的 swing 组件的程序。

我想要做的是在专用于此动画的单独 JPanel 上创建一个 2D 动画。所以我将覆盖 paintComponent (Graphics g) 方法。

我有使用 for 循环 + 线程制作动画的经验,但我听说线程在 swing 中不安全。

因此,使用 Runnable 接口(interface)制作动画对我来说安全吗?如果不是,我应该使用什么(例如计时器),请举一个小例子说明如何最好地使用它(或网页链接)。

编辑:

感谢 Jeff,我将使用 Timer 来创建动画。对于这个问题的 future 观众,这是我在大约 5 分钟内编写的一个快速程序,请原谅脏代码。

我还添加了一些快速评论。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


class JFrameAnimation extends JFrame implements ActionListener
{

JPanel panel;
Timer timer;
int x, y;

public JFrameAnimation ()
{
super ();
setDefaultCloseOperation (EXIT_ON_CLOSE);
timer = new Timer (15, this); //@ First param is the delay (in milliseconds) therefore this animation is updated every 15 ms. The shorter the delay, the faster the animation.
//This class iplements ActionListener, and that is where the animation variables are updated. Timer passes an ActionEvent after each 15 ms.

}


public void run ()
{

panel = new JPanel ()
{
public void paintComponent (Graphics g) //The JPanel paint method we are overriding.
{
g.setColor (Color.white);
g.fillRect (0, 0, 500, 500); //Setting panel background (white in this case);
//g.fillRect (-1 + x, -1 + y, 50, 50); //This is to erase the black remains of the animation. (not used because the background is always redrawn.
g.setColor (Color.black);
g.fillRect (0 + x, 0 + y, 50, 50); //This is the animation.

}

}
;
panel.setPreferredSize (new Dimension (500, 500)); //Setting the panel size

getContentPane ().add (panel); //Adding panel to frame.
pack ();
setVisible (true);
timer.start (); //This starts the animation.
}


public void actionPerformed (ActionEvent e)
{
x++;
y++;
if (x == 250)
timer.stop (); //This stops the animation once it reaches a certain distance.
panel.repaint (); //This is what paints the animation again (IMPORTANT: won't work without this).
panel.revalidate (); //This isn't necessary, I like having it just in case.

}


public static void main (String[] args)
{
new JFrameAnimation ().run (); //Start our new application.
}
}

最佳答案

Jimmy,我认为您误解了线程在 Swing 中的工作方式。您必须使用一个称为 Event Dispatch Thread 的特定线程来对 swing 组件进行任何更新(除了一些特定的异常(exception)情况,我不会在这里讨论)。您可以使用一个 Swing 计时器来设置一个循环任务以在事件分派(dispatch)线程上运行。请参阅此示例,了解如何使用 Swing 计时器。 http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html

您还应该阅读 Event Dispatch Thread,以便了解它在 Swing 中的位置 http://download.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

Java 还在 SwingUtilities 类中提供了多种使用 Swing 的方法,特别是 invokeLaterinvokeAndWait 将在事件派发线程。

关于Java:使用 Swing 的安全动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6273581/

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