Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置一系列图像的动画_Java - Fatal编程技术网

Java 设置一系列图像的动画

Java 设置一系列图像的动画,java,Java,我正在用java制作一系列图像的动画。到目前为止,我能够没有任何问题的动画。只有在添加控件(启动、停止等)时才会出现问题。当我在GUI中按Start时,GUI不会显示动画,只会在动画结束后显示最后一帧 我不确定这是线程问题还是绘画问题,因为我尝试了一些方法,但没有一种有效 以下是我的代码: 公共类SwingOrganization扩展JPanel实现ActionListener{ protected JFrame frame; protected JLabel lblDisplay; prot

我正在用java制作一系列图像的动画。到目前为止,我能够没有任何问题的动画。只有在添加控件(启动、停止等)时才会出现问题。当我在GUI中按Start时,GUI不会显示动画,只会在动画结束后显示最后一帧

我不确定这是线程问题还是绘画问题,因为我尝试了一些方法,但没有一种有效

以下是我的代码:


公共类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())做到了。但我需要让应用程序运行一次,然后才能看到