Java 设置一系列图像的动画
我正在用java制作一系列图像的动画。到目前为止,我能够没有任何问题的动画。只有在添加控件(启动、停止等)时才会出现问题。当我在GUI中按Start时,GUI不会显示动画,只会在动画结束后显示最后一帧 我不确定这是线程问题还是绘画问题,因为我尝试了一些方法,但没有一种有效 以下是我的代码:Java 设置一系列图像的动画,java,Java,我正在用java制作一系列图像的动画。到目前为止,我能够没有任何问题的动画。只有在添加控件(启动、停止等)时才会出现问题。当我在GUI中按Start时,GUI不会显示动画,只会在动画结束后显示最后一帧 我不确定这是线程问题还是绘画问题,因为我尝试了一些方法,但没有一种有效 以下是我的代码: 公共类SwingOrganization扩展JPanel实现ActionListener{ protected JFrame frame; protected JLabel lblDisplay; prot
公共类SwingOrganization扩展JPanel实现ActionListener{
protected JFrame frame;
protected JLabel lblDisplay;
protected JButton BtnStart, BtnStop, BtnPause;
protected JCheckBox chkLoop;
protected Thread th;
public static void main(String[] args) {
SwingAnimation sa = new SwingAnimation();
}
public SwingAnimation() {
frame = new JFrame("Animation");
Panel panel = new Panel();
lblDisplay = new JLabel();
BtnStart = new JButton("Start");
BtnStop = new JButton("Stop");
BtnPause = new JButton("Pause");
chkLoop = new JCheckBox("Loop");
BtnStop.setEnabled(false);
BtnPause.setEnabled(false);
BtnStart.setActionCommand("start");
BtnStop.setActionCommand("stop");
BtnPause.setActionCommand("pause");
panel.add(lblDisplay);
panel.add(BtnStart);
panel.add(BtnPause);
panel.add(BtnStop);
panel.add(chkLoop);
frame.add(panel, BorderLayout.CENTER);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//set the frame in the center of the screen
Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();
int screen_x = (screensize.width - frame.getWidth()) / 2;
int screen_y = (screensize.height - frame.getHeight()) / 2;
frame.setLocation(screen_x, screen_y);
BtnStart.addActionListener(this);
BtnStop.addActionListener(this);
BtnPause.addActionListener(this);
chkLoop.addActionListener(this);
th = new Thread();
//ImageAnimator();
}
public void ImageAnimator() {
try {
for (int i = 0; i <= 299; i++) {
ImageIcon images = new ImageIcon("C:\\Users\\Desktop\\Images\\Snap" + i + ".jpg");
lblDisplay.setIcon(images);
th.sleep(25);
}
} catch (InterruptedException e) {
}
}
public void actionPerformed(ActionEvent e) {
if ("start".equals(e.getActionCommand())) {
BtnStart.setEnabled(false);
BtnStop.setEnabled(true);
BtnPause.setEnabled(true);
lblDisplay.setVisible(true);
ImageAnimator();
} else if ("stop".equals(e.getActionCommand())) {
BtnStart.setText("Start");
BtnStart.setEnabled(true);
BtnStop.setEnabled(false);
BtnPause.setEnabled(false);
lblDisplay.setVisible(false);
th = null;
} else if ("pause".equals(e.getActionCommand())) {
BtnStart.setText("Resume");
BtnStart.setEnabled(true);
BtnStop.setEnabled(true);
BtnPause.setEnabled(false);
}
}
受保护的JFrame;
受保护的JLabel lblDisplay;
受保护的JButton BtnStart、BtnStop、BtnPause;
受保护的JCheckBox chkLoop;
保护螺纹;
公共静态void main(字符串[]args){
SwingAnimation sa=新SwingAnimation();
}
公共组织(){
帧=新帧(“动画”);
面板=新面板();
lblDisplay=新的JLabel();
BtnStart=新的JButton(“开始”);
BtnStop=新按钮(“停止”);
BtnPause=新的JButton(“暂停”);
chkLoop=新的JCheckBox(“循环”);
BtnStop.setEnabled(false);
BtnPause.setEnabled(false);
BtnStart.setActionCommand(“开始”);
BtnStop.setActionCommand(“停止”);
BtnPause.setActionCommand(“暂停”);
面板。添加(lblDisplay);
面板。添加(BtnStart);
面板。添加(BtnPause);
面板。添加(BtnStop);
panel.add(chkLoop);
添加(面板、边框布局、中心);
框架。设置尺寸(400400);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//将框架设置在屏幕中央
维度screensize=Toolkit.getDefaultToolkit().getScreenSize();
int screen_x=(screensize.width-frame.getWidth())/2;
int screen_y=(screensize.height-frame.getHeight())/2;
帧设置位置(屏幕x、屏幕y);
BtnStart.addActionListener(此);
BtnStop.addActionListener(这个);
BtnPause.addActionListener(此);
chkLoop.addActionListener(this);
th=新螺纹();
//图像动画师();
}
public void ImageAnimator(){
试一试{
对于(int i=0;i快速修复:
更改ImageAnimator(),如下所示:
lblDisplay.setIcon(images);
lblDisplay.paintImmediately(getBounds());
th.sleep(25);
您遇到的问题是,设置图标不会自动导致Swing在屏幕上重新绘制组件。立即调用paintright可以做到这一点
一般建议:
swing中的动画通常是使用完成的。您会注意到,此时您的UI没有响应-一旦启动动画,您将无法停止它,直到动画结束。这是因为所有swing事件都发生在单个线程上-事件调度线程。使用thread.sleep(…)运行循环在中间连接这个线程,使它不可用以处理其他输入(例如按下停止按钮)
当我试图理解Swing如何处理并发性时,它给了我极大的帮助,并且在有效使用Swing、绘制自定义组件等方面提供了很多建议
我还将插入演示代码,目前正在阅读这本书,值得一看。快速修复:
更改ImageAnimator(),如下所示:
lblDisplay.setIcon(images);
lblDisplay.paintImmediately(getBounds());
th.sleep(25);
您遇到的问题是,设置图标不会自动导致Swing在屏幕上重新绘制组件。立即调用paintright可以做到这一点
一般建议:
swing中的动画通常是使用完成的。您会注意到,此时您的UI没有响应-一旦启动动画,您将无法停止它,直到动画结束。这是因为所有swing事件都发生在单个线程上-事件调度线程。使用thread.sleep(…)运行循环在中间连接这个线程,使它不可用以处理其他输入(例如按下停止按钮)
当我试图理解Swing如何处理并发性时,它给了我极大的帮助,并且在有效使用Swing、绘制自定义组件等方面提供了很多建议
我还将插入演示代码,目前我正在阅读这本书,值得一看。这涵盖了几种基本的动画技术。引用了一些说明这些技术的相关示例,这完整的演示了停止和启动按钮。这涵盖了几种基本的动画技术。一些相关的示例列举了这些技术的LE,并且完整地说明了停止和开始按钮。方法名称应该从小写字母“IMAIGIMASTER(…)):好的调用开始。我和一些EXC++ C++大师合作,并且已经习惯了他们随机的方法来进行资本化,甚至没有登记。(感谢您的建议,但是paintInstance()方法不起作用,因为它一直告诉我它找不到符号。但我将切换到swing计时器。这将教会我重新检查我有一段时间没有使用过的东西。我认为lblDisplay.paintInstance(lblDisplay.getBounds())应该这样做,但无论如何你最好使用swing计时器。:)好吧,lblDisplay.paintInstance(lblDisplay.getBounds())没有这样做,而是lblDisplay.paint(lblDisplay.getGraphics())我需要让应用程序在我看到动画之前运行一次。方法名称应该从小写字母开始,这样IMAIGIMASTER(…):好的调用。我和一些EXC++ C++大师一起工作,并且已经习惯了他们的随机方法来进行资本化,甚至没有登记。方法不起作用,因为它一直告诉我它找不到符号。但我将切换到swing计时器。这将教会我重新检查我有一段时间没有使用过的东西。我认为lblDisplay.paintInstance(lblDisplay.getBounds())应该起作用,但无论如何,你最好使用swing计时器。:)好吧,lblDisplay.paintInstance(lblDisplay.getBounds())没有做到这一点,而是lblDisplay.paint(lblDisplay.getGraphics())做到了。但我需要让应用程序运行一次,然后才能看到