Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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 Swing在一个循环中运行多个模拟_Java_Swing - Fatal编程技术网

Java Swing在一个循环中运行多个模拟

Java Swing在一个循环中运行多个模拟,java,swing,Java,Swing,我编写了一个简单的模拟,其中两个球以不同的速度移动,试图移动到帧的中间,然后移动回它们的起始位置。在指定的,totalTime结束时,我结束模拟并记录该数据 我的问题是,是否可以自动循环并运行多个模拟?当前,当mytotalTime启动时,动画将冻结,但窗口不会关闭。理想情况下,我想,我希望看到旧窗口关闭,新窗口弹出新的速度为不同的球 因此,我的代码如下所示: public static void main(String[] args) { SwingUtilities.invokeL

我编写了一个简单的模拟,其中两个球以不同的速度移动,试图移动到帧的中间,然后移动回它们的起始位置。在指定的,
totalTime
结束时,我结束模拟并记录该数据

我的问题是,是否可以自动循环并运行多个模拟?当前,当my
totalTime
启动时,动画将冻结,但窗口不会关闭。理想情况下,我想,我希望看到旧窗口关闭,新窗口弹出新的速度为不同的球

因此,我的代码如下所示:

 public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            double rSpeed = 0;
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            frame.setSize(500, 500);
            Rectangle r = frame.getBounds();
            frame.add(new MoveAgents(r.getWidth(), rSpeed));
        }            
    });
}

public MoveAgents(double w, double rFrameSpeed) {
     //initialize my 2 balls and their speeds and starting locations

    Timer timer = new Timer(15, null);
    timer.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            totalTime++;

            if (totalTime == 1000) {
                timer.stop();

                try {
                    generateCsvFile(OUTPUT_FILE);
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
            }
          //otherwise, do things 
    }
 }
是否可以自动循环并运行多个模拟

对。模拟结束后,不要尝试替换视图。相反

  • 计时器上调用
    stop()

  • 调用
    generateCsvFile()
    保存结果

  • 与第一次完全一样初始化仿真模型

  • 计时器上调用
    restart()

在下面的示例中,模型是一个名为
data
int
,模拟只渲染该模型并将其递增到
1000
。重复模拟次数的
计数
作为参数传递给
模拟
构造函数。替代
frame.setSize()
,替代绘图面板的
getPreferredSize()
,如前所述


啊,谢谢,太棒了!这比我在main方法中尝试执行循环时遇到的所有问题都要好得多。@Kevin:我发现将
javax.swing.Timer
看作是提供了一个可以从外部控制的循环,并且不会阻塞进程。
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
 * @see https://stackoverflow.com/a/37293513/230513
 */
public class SimTest {

    private void display() {
        JFrame f = new JFrame("SimTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new Simulation(8));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private static class Simulation extends JPanel {

        private final Font font = this.getFont().deriveFont(36f);
        private int count;
        private int data;
        Timer t = new Timer(100, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                repaint();
                if ((data += 100) == 1000) {
                    t.stop();
                    System.out.println("Saving results…");//generateCsvFile();
                    if (--count == 0) {
                        System.out.println("Fin!");
                        System.exit(0);
                    } else {
                        init();
                        t.restart();
                    }
                }
            }
        });

        public Simulation(int count) {
            this.count = count;
            init();
            t.start();
        }

        private void init() {
            data = 0;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setFont(font);
            g.drawString(String.valueOf(data), 8, g.getFontMetrics().getHeight());
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(256, 128);
        }
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new SimTest()::display);
    }
}