Вопрос

Я разрабатываю настольное приложение 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.Является ли это правильным подходом для этого или есть какой-либо другой механизм, с помощью которого я могу сгруппировать все четыре кнопки в группу кнопок, чтобы только одна могла иметь указанное свойство одновременно (например, переключатели)?

Это было полезно?

Решение

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

Другие советы

Вы можете получить стандартный цвет фона для кнопок из 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.Таким образом, начальное значение равно значению по умолчанию, и кнопка затем оформляется при действии кнопки будут выглядеть действующими как часть группы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top