Изменить цвет кнопки по клику без окончательного модификатора
Рассмотрим следующий код, используемый для изменения цвета кнопки при нажатии.
import java.awt.Color; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; public class ChangeColor < public static void main(String[] args) < JButton button = new JButton(); button.setBackground(Color.BLUE); button.addActionListener(new AbstractAction() < private static final long serialVersionUID = 1L; @Override public void actionPerformed(ActionEvent e) < button.setBackground(Color.RED); >>); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(button); frame.setSize(200, 200); frame.setVisible(true); > >
Это не работает из-за этой ошибки:
Невозможно сослаться на неконечную локальную переменную, определенную в ограничивающей области
Как я могу сделать это, не отмечая кнопку как окончательную?
2 ответа
Одним из решений было бы получить ссылку на JButton из параметра ActionEvent:
@Override public void actionPerformed(ActionEvent e) < // the source here refers to the object that provoked this method to occur JButton sourceBtn = (JButton) e.getSource(); sourceBtn.setBackground(Color.RED); >
Также вы можете сделать кнопку полем, а не локальной переменной.
Также вы можете объявить это как окончательный.
Обратите внимание, что вы никогда не будете использовать такой код, как тот, который вы публикуете, поскольку большинство нетривиальных программ с графическим интерфейсом не будут создаваться внутри статического основного метода, как вы делаете, а скорее будут выполняться в OOP-совместимых классах с графическим интерфейсом.
import java.awt.Color; import java.awt.event.ActionEvent; import javax.swing.*; public class ButtonColorChange extends JPanel < private JButton button = new JButton(new ButtonAction("Press Me")); public ButtonColorChange() < add(button); >private static void createAndShowGui() < JFrame frame = new JFrame("ButtonColorChange"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new ButtonColorChange()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); >public static void main(String[] args) < SwingUtilities.invokeLater(new Runnable() < public void run() < createAndShowGui(); >>); > > class ButtonAction extends AbstractAction < private static final Color COLOR_1 = Color.BLUE; private static final Color COLOR_2 = Color.RED; public ButtonAction(String name) < super(name); int mnemonic = (int) name.charAt(0); putValue(MNEMONIC_KEY, mnemonic); >@Override public void actionPerformed(ActionEvent e) < AbstractButton btn = (AbstractButton) e.getSource(); Color c = btn.getBackground(); c = c == COLOR_1 ? COLOR_2 : COLOR_1; btn.setBackground(c); >>
Отредактируйте в отношении дальнейших ваших вопросов:
На самом деле код в моем вопросе — это только пример, настоящий код — что-то вроде вашего.
Тогда лучше показать реальный код или лучший минимальный компилируемый исполняемый пример, который имитирует реальный код.
(а) Предпочтительно использовать e.getSource() или сделать кнопку полем?
Либо или. Если одно и то же действие нужно использовать для нескольких кнопок, и вас интересует только нажатие кнопки, используйте getSource() , Если ваш Action или ActionListener является внутренним классом, то поле будет работать нормально. Если нет, то вы можете передать переменную в Action через параметр конструктора, как в другом ответе на ваш вопрос.
(б) Вы говорите, что вы также можете объявить его как окончательный, но я получаю эту ошибку: Локальная переменная, возможно, не была инициализирована. В чем я не прав?
Трудно сказать без вашего реального кода, но, скорее всего, вы не инициализируете кнопку одновременно с ее объявлением.
(c) В моей программе с графическим интерфейсом я не запускаю фрейм из потока (то есть я пишу код createAndShowGui() в main(), без потока). В чем разница?
Мой код гарантирует, что мой графический интерфейс запустится в потоке событий Swing, что должно быть сделано для обеспечения безопасности потока.
Как изменить кнопку java
Для изменения и создания кнопки можно воспользоваться пакетами javax.swing и java.awt . Сначала создадим объект класса JFrame , объект класса Button , зададим различные свойства, получим объект класса Container , добавим в него наш объект Button :
import javax.swing.JButton; import javax.swing.JFrame; import java.awt.Color; import java.awt.Container; import java.awt.FlowLayout; // Создаем окно нашего приложения JFrame jFrame = new JFrame(); // Создаем кнопку с текстом JButton button = new JButton("Click me"); // Задаем размеры кнопки button.setSize(100,100); // Изменяем цвет заливки кнопки на темно-серый button.setBackground(Color.LIGHT_GRAY); // Задаем размеры окна jFrame.setSize(500, 500); // При закрытии окна наша программа завершит работу jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Сделаем наше окно видимым jFrame.setVisible(true); // Получим контейнер, где разместим кнопку Container container = jFrame.getContentPane(); // Настроим то, как компоненты будут располагаться в контейнере // Каждая строка контейнера будет выровнена по центру // Горизонтальные и вертикальные зазоры будут по 10 container.setLayout(new FlowLayout(FlowLayout.CENTER, 10 ,10)); // Добавляем нашу кнопку как компонент в контейнер container.add(button);
Как установить цвет фона кнопки в Java GUI?
Ниже приведен код, который создает 9 кнопок в форме gridlayout на определенном pannel3. Я хочу, чтобы фон каждой кнопки черный с серым текстом над ним. Может ли кто-нибудь помочь?
Честно говоря, люди, используйте IDE. Автозаполнение является одним из лучших способов изучения языковой библиотеки, а имена методов обычно не требуют пояснений.
@JohnnyCoder, я думаю, я был разочарован, и это был мой способ сказать rtfm. Я все еще верю, что это хороший совет, хотя 🙂
7 ответов
Ознакомьтесь с JButton. Особое внимание обратите на методы setBackground и setForeground , унаследованные от JComponent .
Это не работает с Java 8 на Mac. Цвет фона — это цвет кнопки. Затем кнопка рисуется поверх черного фона, а кнопка серого цвета с серым текстом. (вы не можете прочитать текст). На самом деле, это еще хуже . черный фон вообще не рисуется, если setOpaque(true) вызывается первым.
Чтобы использовать значения RGB:
btn[i].setBackground(Color.RGBtoHSB(int, int, int, float[]));
Возможно, вам может понадобиться использовать метод setOpaque, чтобы убедиться, что цвета отображаются, передав true методу.
Изменение свойства фона может быть недостаточным, поскольку компонент больше не будет выглядеть как кнопка. Возможно, вам понадобится повторно реализовать метод рисования, как в здесь, чтобы получить лучший результат:
Используйте setBackground для установки фона и setForeground, чтобы изменить цвет текста. Обратите внимание, однако, что помечать серый текст на черном фоне может сделать ваш текст немного трудным для чтения.
Кажется, что метод setBackground() не работает на некоторых платформах (я использую Windows 7). Я нашел этот ответ на этот вопрос полезным. Однако я не использовал его полностью для решения моей проблемы. Вместо этого я решил, что было бы намного проще и почти эстетично раскрашивать панель рядом с кнопкой.
Ещё вопросы
- 0 $ _GET удаляет некоторые символы (+) и ломает мой ключ шифрования
- 0 Метод $ http.get в angularjs для отдыха Api
- 0 CSS не меняется при вызове JS в HTML
- 1 Python 3 добавляет элементы в список независимо от ключа, используемого в dict
- 0 Angularjs сбрасывает радиовход, если щелкнуть два раза подряд
- 1 Как найти значения Min и Max для строк в словаре при использовании DictReader в Python 3
- 0 Используйте mousedown и перетащите, чтобы увеличить изображения миниатюр?
- 1 d3.behavior.zoom () перемещает график в угол вместо центра
- 1 Проблемы сортировки слиянием
- 0 Оператор indexOf IF ищет два значения в одной строке, используя &&
- 1 Как я могу отправить данные в определенный сокет?
- 1 Может ли JavaScript запускать несколько функций одновременно?
- 0 Использование ‘CvHaarClassifierCascade *’ в программе facedetect с использованием opencv и eclipse
- 1 Динамический запрос crm rest builder для отношения многих ко многим
- 1 Удаление строк, содержащих NaN, при сохранении индекса
- 0 Возврат и передача массива для работы в C ++
- 1 Перенос проекта для использования localDB
- 0 angularjs публикует сложные данные в WebApi 2
- 0 массивы javascript внутри массива
- 0 JQuery установить фокус на равномерном выборе
- 1 Что делает getExternalFilesDir (), если SD-карта не установлена?
- 0 Изменить css объекта, используя jquery, итерируя по массиву объектов
- 1 Переменная JavaScript не меняется внутри функции setInterval ()?
- 0 Как можно остановить кнопку с помощью JQuery
- 0 Как переключаться между методами событий jquery?
- 1 Панды read_csv для gziped файла не выводят числовые типы столбцов
- 0 Ошибки включения Android NDK с помощью cURL
- 1 Передача значений из представления в качестве входных значений для формирования в ASP.NET MVC
- 1 Датагрид привязка МВВМ
- 1 C # Создание чатов с несколькими клиент-серверными сокетами
- 0 c ++ перезаписывает данные файла?
- 0 выберите coressponding следующий дочерний элемент
- 1 Панды серии с разной длиной
- 1 Повторное использование потоков данных в течение некоторого времени
- 0 Соответствие строк в MySQL: 1 изменено: 0 предупреждений: 0 для столбца даты
- 0 Переключение языков не работает
- 0 Knex MySQL Migration «Ошибка необработанного отклонения: запрос транзакции уже выполнен»
- 0 Неявное преобразование типов со ссылкой на void *
- 0 Qt QML MenuBar и меню не отображаются
- 1 Android: отображение неверной даты окончания (за день до фактической даты) в Календаре Google при добавлении события с намерением
- 0 ошибка: ‘virtual bool wxTopLevelWindowGTK :: Show (bool)’ недоступен
- 1 Как установить TCP-соединение и отправить данные в Android Virtual Device App
- 0 Сортировка столбцов таблицы в AngularJS
- 1 Визуализация времени разработки пользовательских элементов управления в пользовательском Region / RegionManager
- 1 отправить с клиента на сервер и с сервера на клиент в Java
- 0 Как получить доступ к данным $ _POST для нескольких форм
- 0 отредактируйте htaccess, чтобы сделать его нечувствительным к регистру
- 0 Удаление объекта в AngularJS
- 0 Передать пользовательскую переменную в анонимную функцию щелчка jQuery
- 1 Получить имена всех файлов в пути
Блог
Лучший способ раскрасить кнопки — использовать значки изображений вместо текста. Вы могли бы использовать Gimp для их проектирования.
Убедитесь, что фон прозрачный!
button.setIcon(new javax.swing.ImageIcon(getClass().getResource("/images/myimage.png")));
Это отключенная button.setDisabledIcon(. кнопка:
Это включенная кнопка, не нажата:
Это нажатая кнопка включения:
Изменение цвета фона после нажатия выполняется с помощью Swing. Для этого вам нужно всего 2 изображения.
Комментарии:
1. да, я тоже пробую это, но когда я использую значок для всей кнопки, при нажатии кнопки нет графического действия (некоторое изменение цвета).
2. Небольшая хитрость здесь заключается в том, что вы должны сделать фон изображения прозрачным.
3. 1 но я не знаю, какое отношение к этому имеет Gimp. Вы можете создать сплошное цветное изображение во время выполнения примерно за 5 строк кода.
4. Я просто делаю свои png-файлы с помощью Gimp. 🙂
Ответ №2:
Вы должны выбрать внешний вид, в котором используется цвет фона так, как вы хотите. Я не знаю, что вы используете в данный момент. Если у вас установлен LAF по умолчанию, настройки цвета и удаления границы должно быть достаточно:
button.setBackground(color); button.setBorder(null);