Gui SwingWorker ...在重新绘制前不更新所有内容

时间:2011-10-18 04:34:53

标签: user-interface swingworker

我的gui是使用SwingWorker更新的50x50 GridLayout。

GridLayout中的每个网格都有一个GridGraphic组件,它具有特定的强度 默认强度= 0,这只是一个黑色组件。如果强度= 5,则网格显示为黑色,带有黄点。

当按下Step按钮时,StepManager应该遍历所有网格并更新它们的强度,然后立即重新绘制所有内容,但StepManager在第一个具有强度= 5的alue的GridGraphic之后停止执行。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.event.*;


public class Gui extends JFrame{

    private JPanel buttonPanel, populationPanel, velocityPanel, gridPanel;
    private JButton setupButton, stepButton, goButton;
    private JLabel populationNameLabel, velocityNameLabel, populationSliderValueLabel, velocitySliderValueLabel;
    private JSlider populationSlider, velocitySlider;
    private GridGraphic [] [] gridGraphic;
    private int agents = 125;
    private int velocity = 500;
    private boolean resetGrid;
    private StepManager step;


    public Gui() {

        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();


        //Set up JButtons
        buttonPanel = new JPanel();
        setupButton = new JButton("Setup");
        stepButton = new JButton("Step");
        goButton = new JButton("Go");

        buttonPanel.add(setupButton);
        buttonPanel.add(stepButton);
        buttonPanel.add(goButton);

        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 3;
        add(buttonPanel, c);




    public GridGraphic getGridGraphic(int n1, int n2){
        return gridGraphic[n1][n2];
    }


    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        Gui gui = new Gui();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Display the window.
        gui.pack();
        gui.setVisible(true);
        gui.setResizable(false);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

2 个答案:

答案 0 :(得分:1)

我相信会发生的步骤是在一个单独的线程中执行,因此当你对它调用execute方法时,它会在一个单独的线程中开始执行,这可能在你调用repaint方法后完成执行。你想要的是在工人完成任务后调用重绘。查看SwingWorker的done()方法。

答案 1 :(得分:1)

你得到某种例外吗?

在您的代码中

   for(int i = 0; i < 50; i++){
        for(int j = 0; j < 50; j++){
            if(grid[i][j].getIntensity()==5){
                grid[i][j].setDefault();
                grid[i-1][j-1].setAgent();
            }
        }
    }

我可以看到一个ArrayIndexOutOfBoundsException,因为如果i或j为0并且grid [i] [0]和/或grid [0] [j]具有强度,则可能正在访问grid [-1] [ - 1] 5。


编辑:另一件事。在执行SwingWorker之后,您似乎只重画了一次GUI。但是,SwingWorker是一个线程,因此重绘将在工作人员启动后立即执行,而不是在完成之后执行。尝试用完成的方法调用重绘。