Лучший способ изменить фон JButtons - PullRequest
2 голосов
/ 25 мая 2011

Прямо сейчас я меняю цвет фона кнопки, используя

button.setBackground(Color.WHITE);

Это пример.

Но когда у меня огромная сетка из кнопок j (1000+),просто запустить цикл for для изменения фона каждой кнопки очень, очень медленно.Вы можете видеть, как сетка медленно становится белой, коробка за коробкой.Я действительно не хочу этого

Есть ли лучший способ изменить каждый JButton на сетке на один и тот же цвет в одно и то же время?

Вот как я делаю сетку,используемые цифры приведены только для примера ...

grid = new JPanel(new GridLayout(64, 64, 0, 0));

Это 4096 кнопок, для изменения каждой кнопки на один и тот же цвет требуется около 30+ секунд.

Редактировать 1: Мне нужны кнопки, чтобыбыть кликабельным, например, когда я нажимаю кнопку, она становится синей, например.когда все кнопки нажаты, измените цвет каждой кнопки на белый.Прямо сейчас у меня это работает нормально, но просто медленно менять цвет каждой кнопки.

Редактировать 2: вот как я меняю кнопки:

    new javax.swing.Timer(300, new ActionListener() {
        int counter = 0;
        public void actionPerformed(ActionEvent e) {
            if (counter >= counterMax) {
                ((Timer) e.getSource()).stop();
            }
            Color bckgrndColor = (counter % 2 == 0) ? flashColor : Color.white;
            for (JButton button : gridButton) {
                button.setBackground(bckgrndColor);
            }
            counter++;
        }
    }).start();

Ответы [ 2 ]

6 голосов
/ 25 мая 2011

Тот факт, что вы видите, что коробки перекрашиваются по отдельности , указывает на то, что либо двойная буферизация отключена, либо код рисования в пользовательском интерфейсе кнопки использует paintImmediately().

Я проверил вашу настройку с 64x64 JButtons, и убедился, что все операции пользовательского интерфейса были выполнены в EDT (потоке диспетчеризации событий). Я могу подтвердить эффект, который вы видели, изменение фона всех кнопок заняло около 1200 мс, при этом каждая коробка была немедленно перекрашена. Вы можете обойти немедленные перекраски, установив сетку невидимой до и видимой после изменения фона:

grid.setVisible(false);
for (Component comp : grid.getComponents()) {
   comp.setBackground(color);
}
grid.setVisible(true);

Это заставило сетку выполнить только одну перерисовку и сократило время до ~ 300 мс (фактор 4).

Это все еще слишком медленно для частых обновлений, поэтому вам лучше использовать пользовательский компонент , который рисует сетку , или контейнер с навесным весом (что trashgod предложил в комментарии к вашему вопросу), если вы хочу, чтобы ячейки сетки были произвольными компонентами.

2 голосов
/ 25 мая 2011

Вы можете получить значительную выгоду, если перекрасить только видимые кнопки.В подходе MVC , показанном ниже, каждая кнопка прослушивает модель, которая определяет ее текущее состояние.Обновление модели происходит довольно быстро по сравнению с перекрашиванием.Хотя запуск занимает несколько секунд, я вижу, что обновления занимают <10 мс.в стационарном состоянии.Это не так масштабируемо, как <a href="http://en.wikipedia.org/wiki/Flyweight_pattern" rel="nofollow noreferrer"> образец веса в полете , используемый JTable, проиллюстрированный здесь , но он может служить.

...