Java Swing — глобальное изменение панелей на розовый фон

Я знаю, что вы можете изменить общий внешний вид приложения, установив «внешний вид». Есть ли способ глобально изменить компоненты без написания класса внешнего вида? Например, если бы вы хотели, чтобы все ваши кнопки были черными, как бы вы это сделали? Я рисую пустышку.

Спасибо СТ


person soulTower    schedule 07.01.2011    source источник


Ответы (4)


Используйте UIManager и измените значения по умолчанию для вашего внешнего вида. Здесь есть хороший инструмент: http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/ что если вы запустите программу Java Web Start, она позволит вам просматривать ключи и значения для каждого компонента.

Однако простое изменение фона может вызвать некоторые новые проблемы, взгляните на этот вопрос: изменить цвет фона?

person jzd    schedule 07.01.2011

Одним из решений может быть заводской шаблон;

Вы можете создать класс Factory, который создает кнопки с предопределенными настройками. Каждый раз, когда вам нужна кнопка, используйте этот фабричный класс, и вы получите объекты с предопределенными свойствами.

Button button = factory.createButton()

class Factory{
 Button createButton(){
   Button button = new Button();
   button.setBackgroundColor(Color.PINK);
   return  button;
 }
}
person fmucar    schedule 07.01.2011
comment
Спасибо. Я не был ясен. Если у меня есть существующее приложение, и мой клиент сказал, что ему нужна другая цветовая схема для кнопок. Как это могло быть достигнуто? - person soulTower; 07.01.2011
comment
Вы можете расширить класс кнопки с тем же именем, например ; Кнопка расширяет javax.swing.Button и устанавливает значение фона в конструкторе этого нового класса. Однако вам все равно потребуется обновить свой код и заменить весь импорт javax.swing.Button на новый класс. Более простой рефакторинг по сравнению с фабричным способом для существующего кода. - person fmucar; 07.01.2011

Если у вас есть коллекция соответствующих компонентов, вы можете перебирать их, устанавливая цвет фона.

public void setBgColor( Color color, List< Component > components ) {
    for ( Component c : components ) {
        c.setBackgroundColor( color );
    }
}

Самая сложная часть — получить список компонентов. Я сделал это, зарегистрировав определенные группы компонентов в коллекции и используя описанный выше метод для установки различных свойств. Этот сценарий является хорошим аргументом в пользу централизованного создания объектов.

person Heath Lilley    schedule 07.01.2011

Что делать, если не только цвет нужно изменить? Если это приложение, в котором все находится под вашим контролем, имеет смысл использовать наследование — создать базовые классы для всех необходимых компонентов (например, панелей, кнопок) и переопределить метод paintComponent в соответствии с вашими потребностями. Этот подход мог бы быть более модульным, если бы поведение метода paintComponent в базовых компонентах можно было настроить во время создания экземпляра, предоставив соответствующие «рисовальщики», которые вызываются из метода paintComponent.

Вот потенциально полезная ссылка.

person 01es    schedule 23.02.2011