Gui SwingWorker ... не обновляет все перед перерисовкой - PullRequest
0 голосов
/ 18 октября 2011

Мой графический интерфейс - это GridLayout 50x50, который обновляется с помощью SwingWorker.

Каждая сетка в GridLayout имеет компонент GridGraphic с определенной интенсивностью.
Интенсивность по умолчанию = 0, то есть просто черный компонент,Если интенсивность = 5, то сетка выглядит черной с желтой точкой.

Когда нажата кнопка Step, StepManager должен пройти через все сетки и обновить их интенсивность, а затем перерисовать все сразу, ноStepManager прекращает выполнение после первого GridGraphic, который имеет значение с интенсивностью = 5.

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 ]

1 голос
/ 18 октября 2011

Вы получаете какое-то исключение?

В вашем коде

   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, поскольку вы можете обращаться к grid [-1] [- 1], если i или j равны 0, а grid [i] [0] и / или grid [0] [j] имеют интенсивность из 5.


Редактировать: Другое дело. Кажется, вы перерисовываете свой графический интерфейс только один раз, после выполнения SwingWorker. Но SwingWorker - это поток, поэтому перерисовка будет выполняться сразу после запуска работника, а не после его завершения. Попробуйте вызвать repaint в вашем готовом методе.

1 голос
/ 18 октября 2011

Я считаю, что происходит то, что шаг выполняется в отдельном потоке, поэтому, когда вы вызываете метод execute для него, он начинает выполняться в отдельном потоке, который может завершиться после того, как вы вызовете метод repaint.Вы хотите вызвать перерисовку после того, как работник закончил со своей задачей.Изучите метод done () в SwingWorker.

...