【问题标题】:How to set a background color of a JButton in Java?如何在 Java 中设置 JButton 的背景颜色?
【发布时间】:2011-01-06 09:06:58
【问题描述】:

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

因此,一次只能有一个按钮为橙色。

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

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

其余三个按钮也是如此。

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

第一季度。如何获取默认背景颜色?

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

【问题讨论】:

    标签: java user-interface swing background-color


    【解决方案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.:我从未听说过分组按钮。那么,我不能回答你这个问题。

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:
        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);
          ...
          

        【讨论】:

        • +1 建议最佳方法(使用 JToggleButton)。我一直在寻找这种方法。谢谢
        • @trashgod 我用它很多次都没有问题,但没有 JToggleButtons ......无论如何,这取决于外观和感觉是否尊重它:-|这是使用 UIManager 的颜色或使用图标的好理由
        • null 对我不起作用。如果设置为 null,则按钮变为透明,这是不同颜色背景的问题。这是在香草 windows sun jdk 7 上。
        • @Cookie : by documentation "[...] 仅当组件不透明时才使用背景颜色,[...] 尊重此属性取决于外观,有些可以选择忽略它。”
        【解决方案4】:

        这是基于example的“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]

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

            如果您希望可以重新设计整个按钮 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));
            

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-22
              • 1970-01-01
              • 2017-04-05
              • 2018-03-31
              • 2013-08-12
              • 1970-01-01
              • 1970-01-01
              • 2019-07-07
              相关资源
              最近更新 更多