繁体   English   中英

减慢程序的执行以显示步骤

[英]Slowing Down Program's execution to show steps

我有一个运行用于解决难题的基本算法的程序。 我正在尝试减慢速度,以便用户可以看到实际的算法。 我希望程序显示解决难题所需的步骤。 我尝试使用计时器,甚至使用thread.sleep尝试减慢速度。 但是,我的GUI(JPanel)不在delay语句之前或之后重新绘制。 发生的是延迟的发生,并且算法正在逐步解决,但是程序GUI并未更新/重新绘制以显示步骤。 这是该部分的代码:

delay(System.currentTimeMillis(), 500);
repaint();

延迟部分都很好。 谁能告诉我为什么JPanel不重新粉刷?

这是我制作的延迟方法:

public static void delay (long a, int x)  //Simple Delay Method
{
    while((System.currentTimeMillis()-a) < (x/10)){}
}

您不能只休眠UI线程并等待重绘发生,这将在这段时间内停止所有用户和操作系统的交互(包括重绘事件)。 重绘文档

如果此组件是轻型组件,则此方法将导致尽快调用此组件的paint方法。

尽快并不意味着立即开始 ,它很可能会安排重新绘制,该重新绘制将在ui线程释放时运行。

您必须更改算法以将其状态保留在对象中,并使其能够逐步执行,并使用此答案中的计时器


例:

public class SwingMain extends JFrame {
    public class MyPanel extends JPanel {
        public String state = "Initial";

        private JButton btn_start;

        public MyPanel() {
            super();
            btn_start = new JButton("Start");
            add(btn_start);
            btn_start.addActionListener(e -> doSolve());
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setFont(getFont());
            g.drawString(state, 10, 20);
        };

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(640, 480);
        }
    }

    private List<String> states;
    private int stateIndex;
    protected Task token;

    private MyPanel pnl_main;

    public SwingMain() {
        super("Step by step");
        setupUi();
    }

    protected void setupUi() {
        pnl_main = new MyPanel();
        getContentPane().add(pnl_main);
    }

    private List<String> modelSolve() {
        return Arrays.asList("First", "Second", "Third", "Fourth", "Fifth");
    }

    public void doSolve() {
        this.stateIndex = 0;
        this.states = modelSolve();

        if (token != null)
            token.cancel();
        token = GuiTimer.scheduleAtFixedRate(() -> {
            if (stateIndex >= states.size()) {
                token.cancel();
            } else {
                pnl_main.state = states.get(stateIndex);
                stateIndex++;
                pnl_main.repaint();
            }
        }, 0, 500, TimeUnit.MILLISECONDS);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            SwingMain frame = new SwingMain();
            frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            frame.pack();
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
            System.out.println(frame.pnl_main.getWidth());
            System.out.println(frame.pnl_main.getHeight());

        });
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM