Перерисовать JPanel из actionlistener

Я знаю, что есть несколько угроз, как перерисовать JPanel. Я пытался перерисовать JPanel изнутри прослушивателя действий, применяя методы revalidate() и repaint() (как найдено в stackoverflow). К сожалению, это не работает. Но когда я просто меняю текст кнопки, она перерисовывается!

public SimulationPanel()
{
      //configure panel.....

      /* ActionListener */
      btnStepsIntoFuture.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) 
        {               
            //Do something
            /* refresh grid panel */
            worldPanel.createGrid();
            simPanel.revalidate(); //= not working
            simPanel.repaint(); //= not working
            //btnEndSim.setText("End world simulation "); = working
            //btnEndSim.setText("End world simulation"); = working          
        }
      });

     /* Add components to Simulationpanel */
     simPanel.add(buttonsOnTopPanel, BorderLayout.NORTH);
     simPanel.add(worldPanel.getWorldPanel(), BorderLayout.CENTER);
     simPanel.add(stepsIntoFuturePanel, BorderLayout.SOUTH);
}

дополнительная информация: мировая панель представляет собой сетку внутри панели симуляции, но я думаю, это не имеет значения, потому что перерисовка работает путем изменения текста кнопок..

ИЗМЕНИТЬ:

    public void createGrid(){ 
    /* Set constraint on GridBagLayout */
    GridBagConstraints gbc = new GridBagConstraints();
    /* Create world grid with panels */
    for (int row = 0; row < SettingsPanel.getNrOfRows(); row++) {
        for (int col = 0; col < SettingsPanel.getNrOfColumns(); col++) {
            /* Add constraint for correct dimension (row ; column) */
            gbc.gridx = col;
            gbc.gridy = row;

            /* Initialize new cell in world grid */
            CellPanel cellPanel = new CellPanel();

            /* Draw elements of grid */
            drawBackgroundIcons(cellPanel, row, col);
            drawBorders(cellPanel, row, col);

            worldPanel.add(cellPanel, gbc);
        }
    }
    /* Print overview */
    printOverviewOfWorld();
 }


/*  draw background icon of object */
public void drawBackgroundIcons(CellPanel cellPanel, int row, int col)
{
    /*  Set person, zombie weapon icon as background image */
    if(personArray[row][col] != null)
    {
        Image img = new ImageIcon(this.getClass().getResource("/resources/"+personArray[row][col].getName()+".png")).getImage();
        cellPanel.setImg(img);
    }

}

Я позволяю объектам перемещаться на 1 шаг по сетке (вправо, влево, вверх, по диагонали,...), изменяя положение в двумерном массиве.

Как я могу заставить его работать с методами перепроверки/перекраски?

Ваше здоровье


person JaperTIA    schedule 05.01.2016    source источник
comment
Вопрос в том, что делает worldPanel.createGrid();? Вы вызываете метод на worldPanel. Вы действительно создаете новые компоненты и добавляете их в simPanel? Вы не можете просто создать новую ссылку на переменную worldPanel и ожидать, что компоненты будут автоматически добавлены в simPanel. В общем, мы не можем ответить на ваш вопрос, потому что понятия не имеем, что на самом деле делает ваш код.   -  person camickr    schedule 06.01.2016
comment
Спасибо за ваш ответ, я обновил вопрос. Компоненты корректно добавляются в simPanel. Но когда я делаю шаг в будущее, я не добавляю дополнительные компоненты, я просто хочу изменить фон. спасибо заранее   -  person JaperTIA    schedule 06.01.2016


Ответы (1)


Вы можете использовать метод update (Graphics g), как показано ниже:

jPanel.update(jPanel.getGraphics());

у меня работало без использования Worker или Runnable.

до сих пор не могу понять, почему он перерисовывает минимальный размер JFrame, но это работает.

person Pedram    schedule 05.07.2018