Перерисовка коллекции JButtons в синхронизации - PullRequest
0 голосов
/ 24 января 2011

Я рисую массив JButtons.Вызов setBackground немедленно перерисовывает эту кнопку.

Проблема в том, что при повторном вызове redraw кнопки не обновляются синхронно.

т.е. есть небольшая задержка между перерисовкой одной кнопки и другой кнопкой на одном и том же проходе redraw().

Есть ли способ заставить все кнопки перерисовывать все вместе?

Буду признателен за любые указатели или предложения.Спасибо.

Примечание:

  • CellButton расширяет javax.swing.JButton.
  • Все кнопки содержатся в JPanel grid.

final JPanel grid = new JPanel();

Collection<CellButton> cells = new ArrayList<CellButton>();

for(int j=0;j<gridSize;j++){
    for(int i=0;i<gridSize;i++){
        CellButton cellButton = new CellButton(i,j);
        cellButton.setBackground(Color.gray);
        cellButton.addMouseListener(gridListener);
        cells.add(cellButton);
        grid.add(cellButton);
    }
}

...

void redraw(){
    Iterator<CellButton> iter = cells.iterator();
    int x,y;
    while(iter.hasNext()){
        CellButton cellBtn=iter.next();
        x=cellBtn.x();
        y=cellBtn.y();
        cellBtn.setBackground(model.getColor(x,y));
    }
}`

Ответы [ 2 ]

1 голос
/ 24 января 2011

Код выполняется в потоке отправки событий.Установка фона будет только запланировать компонент для перекраски.RepaintManager собирает все запросы на перерисовку и выполняет их за один раз, чтобы повысить эффективность.Перекраска производится только на EDT.Поэтому, если вы измените все свойства EDT, все кнопки должны быть перекрашены одновременно.

0 голосов
/ 25 января 2011

Проверьте, подходит ли вам следующее:

public class ButtonsRedraw {

public static void main(final String[] args) {
final List<JButton> buttons = new ArrayList<JButton>();

SwingUtilities.invokeLater(new Runnable() {

    @Override
    public void run() {
    final JButton green = new JButton(new AbstractAction("Green") {
        @Override
        public void actionPerformed(final ActionEvent e) {
        // runs on EDT
        for (final JButton button : buttons) {
            button.setBackground(Color.green);
        }
        }
    });

    final JButton yellow = new JButton(new AbstractAction("Yellow") {
        @Override
        public void actionPerformed(final ActionEvent e) {
        // runs on EDT
        for (final JButton button : buttons) {
            button.setBackground(Color.yellow);
        }
        }
    });

    for (int index = 1; index <= 10; index++) {
        buttons.add(new JButton("Button " + index));
    }

    final JPanel buttonPanel = new JPanel();
    buttonPanel.add(green);
    buttonPanel.add(yellow);
    for (final JButton button : buttons) {
        buttonPanel.add(button);
    }

    final JFrame frame = new JFrame("Colored buttons");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(buttonPanel);

    frame.pack();
    frame.setVisible(true);
    }
});
}
}

По сути, первая кнопка меняет цвет фона на зеленый для десяти кнопок в списке, а вторая кнопка меняет цвет на желтый.Обратите внимание, что actionPerformed вызывается в EDT, что гарантирует, что любое изменение модели компонента или свойства компонента будет распространено в четную очередь для перерисовки.Следовательно, нет необходимости вызывать перекрасить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...