5

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

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

我应用的当前方法是我在xxxActionPerformed()JButton button1 的方法中实现了以下代码

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

其余三个按钮也是如此。

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

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

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

4

6 回答 6

8

您可以从 UIManager 获取按钮的标准背景颜色:

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

据我所知,按键可能会以不同的外观和感觉发生变化。这是一个不错的 webstart 应用程序,它显示了所有可用的密钥:

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

于 2010-01-18T14:26:53.047 回答
8
  1. 只需使用null默认颜色:

    button1.setBackground(Color.ORANGE);
    button2.setBackground(null);
    ...
    
  2. 考虑使用带有 ButtonGroup 的 JToggleButtons,设置按钮的 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);
    ...
    
于 2010-01-18T15:44:09.920 回答
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.:我从来没有听说过分组按钮。那么,我无法回答你这个问题。

希望能帮助到你。

于 2010-01-18T13:55:44.867 回答
1

这是基于此示例的“Button.background”的横截面:

*** 金属 javax.swing.plaf.metal.MetalLookAndFeel 636 个条目
Button.background: javax.swing.plaf.ColorUIResource[r=238,g=238,b=238]

*** Nimbus com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel 1052 个条目
按钮背景:com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel$NimbusProperty@60961dff

*** CDE/Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel 550 个条目
Button.background: javax.swing.plaf.ColorUIResource[r=174,g=178,b=195]

*** Mac OS X com.apple.laf.AquaLookAndFeel 705 个条目
Button.background:com.apple.laf.AquaNativeResources$CColorPaintUIResource[r=238,g=238,b=238]
于 2010-01-18T15:45:06.143 回答
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));

这就是我使用它的方式..你也可以有自己的方式

于 2015-05-14T08:21:44.640 回答
-1

你有没有研究过java中的装饰器模式,你将一个按钮传递给一个方法,该方法根据按钮是否是当前活动的按钮来装饰它,例如它是否悬停在上面。

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

您从 MouseEvent 或 ActionEvent 方法调用此方法,然后发出 repaint() 。将所有按钮放入一个数组或向量中并循环遍历它,将每个按钮传递给 decorateButton 方法,并将初始布尔值设置为 false,然后在事件中将其设置为 true。这样,初始值是默认值,然后按钮在操作时被装饰,按钮将显示为组的一部分

于 2012-05-17T08:12:52.047 回答