2010-01-18 1 views
5

Я разрабатываю приложение Java Desktop. В нем у меня есть 4 JButtons на JPanel. Теперь я хочу, чтобы всякий раз, когда нажимается кнопка, цвет фона меняется на какой-либо другой цвет (например, оранжевый), чтобы представить, что он был нажат, а цвет фона всех остальных 3 кнопок сбросился до их цвета по умолчанию (в случае, если любой из них был оранжевым фоновый цвет).Как установить фоновый цвет JButton в Java?

Итак, в свое время только одна кнопка может иметь оранжевый цвет.

В настоящее время подход, который я применил в том, что я реализовал следующий код в xxxActionPerformed() методом JButton Button1

button1.setBackground(Color.Orange); 
button2.setBackground(Color.Gray); 
button3.setBackground(Color.Gray); 
button4.setBackground(Color.Gray); 

и аналогично для остальных трех кнопок.

Теперь на самом деле, я не хочу, чтобы цвет backgroud был серым (для кнопки unclicked). Вместо этого мне нужен цвет фона по умолчанию, так что цвет backgroud будет подстраиваться под внешний вид графического интерфейса пользователя в зависимости от внешнего вида платформы конечного пользователя.

Q1. Как получить цвет фона по умолчанию?

Q2. Это правильный подход для этого или есть ли какой-либо другой механизм, посредством которого я могу сгруппировать все четыре кнопки в группе кнопок, чтобы только одно может иметь указанное свойство за один раз (например, переключатели)?

ответ

9
  1. просто использовать null использовать цвет по умолчанию:

    button1.setBackground(Color.ORANGE); 
    button2.setBackground(null); 
    ... 
    
  2. изучить возможность использования 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); 
    ... 
    
+0

+1 для JToggleButton. Использует 'null' надежный? – trashgod

+0

+1 для предложения наилучшего подхода (используя JToggleButton). Я искал такой подход. Спасибо –

+0

@trashgod Я использовал его много раз без проблем, но не с JToggleButtons ... в любом случае это зависит от внешнего вида и чувства, чтобы почитать его или нет: - | это хорошая причина использовать цвет UIManager или использовать значки –

1

Q1 .: Для того, чтобы получить GUI цвет кнопки, просто сделать это

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. *), Вы можете получить цвет всех элементов вашего пользователя интерфейс.

Q2: Я никогда не слышал о кнопках группировки. Тогда я не могу ответить на этот вопрос.

Надеюсь, это поможет.

8

Вы можете получить стандартный цвет фона для кнопок из UIManager:

button1.setBackground(UIManager.getColor("Button.background")); 

Насколько я знаю, ключи могут меняться в различных просмотровых & чувствует. Вот хорошее приложение WebStart, который показывает все доступные ключи:

http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/

+0

+1 для хорошей связи JWS. – trashgod

+0

Это работало для меня, и это мое предпочтительное решение. – Cookie

1

Вот сечение «кнопки.фон»на основе этого example:

 
*** 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: [email protected]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] 
-1

вы смотрели в шаблон декоратора в Java вы передаете кнопку в метод, украшающий его в зависимости от того, кнопки является текущим активным, если он парил над .

public Jbutton decorateButton(JButton b, boolean isHoveredOver){ 
    if(isHoveredOver) 
     b.setBackground(getContentPane().getBackground().GREEN); 
    return b; 
} 

вы вызываете этот метод из методов MouseEvent или ActionEvent и просто выдать перекрасить() после. класть все кнопки в массив или вектор и петли через него проходящий каждый из них в методу decorateButton и дать инициализационное логическое значение false, а затем событие присваивает значение true. Этот способ е начальное значение по умолчанию и кнопка затем оформлен под действием кнопки будут отображаться, действует в составе группы

0

Если вы хотите, вы можете перестроить всю свою кнопку UI

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)); 

Это, как я использую его .. вы можете иметь свой собственный путь слишком

Смежные вопросы