Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中借助线程技术创建动画。但它将o/p作为透明窗口_Java_Multithreading_Swing_Animation - Fatal编程技术网

我已经编写了以下程序,在java中借助线程技术创建动画。但它将o/p作为透明窗口

我已经编写了以下程序,在java中借助线程技术创建动画。但它将o/p作为透明窗口,java,multithreading,swing,animation,Java,Multithreading,Swing,Animation,根据事件委托模型,我使用了一个处理程序类 package simple; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class ButtonHandler implements ActionListener { MainFrame frame; public ButtonHandler(MainFrame frame) { this.fra

根据事件委托模型,我使用了一个处理程序类

package simple;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ButtonHandler implements ActionListener {

    MainFrame frame;

    public ButtonHandler(MainFrame frame) {
        this.frame = frame;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        MyThread thread = new MyThread(frame);
        Thread mthread = new Thread(thread);            
        mthread.start();
    }    
}

一个用于创建框架的大型机类

package simple;

import java.awt.Graphics;    
import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class MainFrame extends JFrame {
    JButton btnStart = new JButton("Start");
    int xPos1,xPos2;    
    public MainFrame()
    {           
        setSize(700, 600);
        setLayout(null);
        setVisible(true);           
        xPos1=10;
        xPos2=600;
        btnStart.setBounds(590, 30, 100, 30);
        add(btnStart);
        btnStart.addActionListener(new ButtonHandler(this));            
        paint(null);            
        setDefaultCloseOperation(EXIT_ON_CLOSE);            
    }

    @Override
    public void paint(Graphics g) {
        g.drawString("Seed", xPos1, 50);
        g.drawString("Infotech", xPos2, 550);
    }
}
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

一个实现可运行接口的线程类

package simple;

public class MyThread implements Runnable {

    MainFrame frame;        

    public MyThread(MainFrame frame) {
        super();
        this.frame = frame;
    }

    @Override
    public void run() {

        while(true)
        {
            frame.repaint();
            try {
                frame.xPos1++;
                frame.xPos2--;
                Thread.sleep(10);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }               
        }
    }    
}
////////////////////////////////////////////////////////////// 一个类只用于main方法

package simple;

public class Test {

    public static void main(String[] args) {
        new MainFrame();
    }
}
谁能告诉我问题出在哪里,因为我对java编程概念还不熟悉

  • 覆盖顶层容器(
    JFrame
    )的
    绘制
  • 不调用
    super.paint(g)
  • 调用
    paint(空)
  • setLayout(空)
  • 通过看一眼和


    您可能会发现
    javax.swing.Timer
    更有用,而不是使用
    线程。查看更多详细信息

    不要阻止EDT(事件调度线程)-发生这种情况时,GUI将“冻结”。不要调用
    Thread.sleep(n)
    为重复任务执行Swing
    计时器,或为长时间运行的任务执行
    SwingWorker
    。有关详细信息,请参阅。有关如何创建动画,请参阅中的
    worldwiew
    类。为了更快地获得更好的帮助,请发布一条消息(如链接答案中所示)。正如旁注所示,10毫秒的睡眠时间是100 fps,对于如此简单的事情,这可能有点太多了。大约40毫秒(约25fps)可能会导致更好的性能,因为系统需要更多的时间来刷新其队列…IMHO