我正在开发一个 Java 桌面应用程序。里面我有4个 JButtons 在一个 JPanel. 。现在我希望每当单击一个按钮时,其背景颜色都会更改为其他颜色(例如橙色),以表示它已被单击,并且所有其他 3 个按钮的背景颜色重置为默认颜色(如果其中任何一个按钮有橙色)背景颜色)。

因此,一次只有一个按钮可以具有橙色。

我当前采用的方法是在 xxxActionPerformed() JButton按钮1的方法

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

其余三个按钮也类似。

现在实际上,我不希望背景颜色为灰色(对于未单击的按钮)。相反,我想要默认的背景颜色,以便背景颜色能够根据最终用户平台的外观调整自身以适应 GUI 的外观。

Q1.如何获得默认背景颜色?

Q2。这是执行此操作的正确方法吗?或者是否有任何其他机制可以将所有四个按钮分组到一个按钮组中,以便一次只有一个按钮可以具有指定的属性(如单选按钮)?

有帮助吗?

解决方案

  1. 只需使用 null 使用默认颜色:

    button1.setBackground(Color.ORANGE);
    button2.setBackground(null);
    ...
    
  2. 考虑将 JToggleButtons 与 ButtonGroup 一起使用,设置按钮的 Icon 和 PressedIcon。无需更改背景颜色。

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

据我所知,键可以在不同的外观和感觉改变。这里是一个很好的在webstart的应用程序,显示所有可用的键:

http://tips4java.wordpress.com/2008/10/09 / UIManager的-默认/

这是基于此的“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:为了得到该按钮的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:我从来没有听说过分组按钮。然后,我不能回答你这一个。

希望它能帮助。

如果你愿意,你可以重新设计你的整个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));

这我如何使用它..你可以有你自己的方式过于

有你看着在Java传递一个按钮到它取决于按钮是否是当前的活动之一,例如,如果它悬停该装饰方法中的装饰图案。

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

您调用从的MouseEvent或ActionEvent的方法,这种方法后只是发出一个重绘()。把所有的按钮到一个数组或载体和环穿过它的每一个到decorateButton方法和得到的假initail布尔值,则在事件将它设置为真。 通过这种方式,初始值是默认然后按钮装饰时动作的按钮将显示为用作基团的一部分

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top