Как установить цвет фона JButton в Java?
-
21-09-2019 - |
Вопрос
Я разрабатываю настольное приложение Java.В нем у меня есть 4 JButtons
на JPanel
.Теперь я хочу, чтобы всякий раз, когда нажимается кнопка, цвет ее фона менялся на какой-либо другой цвет (скажем, оранжевый), чтобы показать, что она была нажата, а цвет фона всех остальных 3 кнопок возвращался к их цвету по умолчанию (в случае, если у какой-либо из них был оранжевый цвет фона).).
Таким образом, одновременно только одна кнопка может иметь оранжевый цвет.
Текущий подход, который я применил, заключается в том, что я реализовал следующий код в xxxActionPerformed()
способ JButton button1
button1.setBackground(Color.Orange);
button2.setBackground(Color.Gray);
button3.setBackground(Color.Gray);
button4.setBackground(Color.Gray);
и аналогично для остальных трех кнопок.
Теперь, на самом деле, я не хочу, чтобы цвет backgroud был серым (для незакрытой кнопки).Вместо этого мне нужен цвет фона по умолчанию, чтобы цвет backgroud сам подстраивался под внешний вид графического интерфейса в соответствии с внешним видом платформы конечного пользователя.
Q1.Как я могу получить цвет фона по умолчанию?
Вопрос 2.Является ли это правильным подходом для этого или есть какой-либо другой механизм, с помощью которого я могу сгруппировать все четыре кнопки в группу кнопок, чтобы только одна могла иметь указанное свойство одновременно (например, переключатели)?
Решение
просто используй
null
чтобы использовать цвет по умолчанию:button1.setBackground(Color.ORANGE); button2.setBackground(null); ...
рассмотрите возможность использования JToggleButtons с ButtonGroup, установите значок и нажмите одну из кнопок.Нет необходимости менять цвет фона.
button1 = new JToggleButton(new ImageIcon("0.jpg")); button1.setSelectedIcon(new ImageIcon("1.jpg")); button2 = new JToggleButton(new ImageIcon("0.jpg")); button2.setSelectedIcon(new ImageIcon("2.jpg")); ... ButtonGroup group = new ButtonGroup(); group.add(button1); group.add(button2); ...
Другие советы
Вы можете получить стандартный цвет фона для кнопок из UIManager:
button1.setBackground(UIManager.getColor("Button.background"));
Насколько я знаю, клавиши могут по-разному выглядеть и ощущаться.Вот хорошее приложение для веб-запуска, которое показывает все доступные ключи:
http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/
Вот поперечный разрез "Button.background", основанный на этом пример:
*** Metal javax.swing.plaf.metal.MetalLookAndFeel 636 entries Button.background: javax.swing.plaf.ColorUIResource[r=238,g=238,b=238] *** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1052 entries Button.background: com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel$NimbusProperty@60961dff *** CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550 entries Button.background: javax.swing.plaf.ColorUIResource[r=174,g=178,b=195] *** Mac OS X com.apple.laf.AquaLookAndFeel 705 entries Button.background: com.apple.laf.AquaNativeResources$CColorPaintUIResource[r=238,g=238,b=238]
Q1.:Чтобы получить цвет графического интерфейса кнопки, просто сделайте это
button1.setBackground(Color.Orange);
button2.setBackground(java.awt.SystemColor.control);
button3.setBackground(java.awt.SystemColor.control);
button4.setBackground(java.awt.SystemColor.control);
С помощью этого класса (java.awt.SystemColor.*) вы можете получить цвет всех элементов вашего пользовательского интерфейса.
Вопрос 2.:Я никогда не слышал о группировке кнопок.Тогда я не могу ответить вам на этот вопрос.
Надеюсь, это поможет.
При желании вы можете переработать весь свой пользовательский интерфейс button
public class buttonUI extends javax.swing.plaf.basic.BasicButtonUI{
buttonUI(JButton b){
b.setContentAreaFilled(false);
}
@Override
public void paint(Graphics g,JComponent c){
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
AbstractButton b = (AbstractButton) c;
g2d.setFont(font.deriveFont(11f));
Dimension d = b.getSize();
FontMetrics fm = g2d.getFontMetrics();
g2d.setColor(new Color(100,100,100));
String caption = b.getText();
int x = (d.width - fm.stringWidth(caption)) / 2;
int y = (d.height + fm.getAscent()) / 2 - 2;
g2d.drawString(caption, x, y);
} }
и в вашей основной части кода используйте, например
jButton1.setUI(new buttonUI(jButton1));
Вот как я это использую ..у тебя тоже может быть свой собственный путь
вы заглядывали в шаблон декоратора в java, когда вы передаете кнопку в метод, который украшает ее в зависимости от того, является ли кнопка текущей активной, например, если она зависла над.
public Jbutton decorateButton(JButton b, boolean isHoveredOver){
if(isHoveredOver)
b.setBackground(getContentPane().getBackground().GREEN);
return b;
}
вы вызываете этот метод из методов MouseEvent или ActionEvent и просто выполняете repaint() после.поместите все ваши кнопки в массив или вектор и выполните цикл по нему, передавая каждую из них методу decorateButton, и присвойте логическое значение initail false, затем при событии установите его в true.Таким образом, начальное значение равно значению по умолчанию, и кнопка затем оформляется при действии кнопки будут выглядеть действующими как часть группы