2011-04-27 213 views
7

我试图改变JToggleButton的颜色,当它以可靠的外观和感觉独立的方式进行选择时。更改所选JToggleButton的背景颜色

如果使用金属大号& F,则使用UIManager的是一种方法:

UIManager.put("ToggleButton.selected", Color.RED); 

注意:IYY指出,我在上面的属性名称的拼写错误,但我会离开它上面的人到达这里,但实际属性的名称应该是:

UIManager.put("ToggleButton.select", Color.RED); 

然而,这并不在我目前的外观(目前的Windows XP)的工作。经过一些进一步的分析,似乎Windows中的系统外观和感觉(仍然是XP)完全不使用Color基于ColorUIManager属性,或者它至少不会自己提供它们(有一个快速示例在线到find all property keys from the UIManager,其在该示例中被方便地明确限制为Color属性)。

我已经尝试设置背景颜色:

Action action = new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent e) { /* stuff */ } 
}; 
JToggleButton button = new JToggleButton(action); 
// tried with and without opaque true 
button.setOpaque(true); 
button.setBackground(Color.RED); 

它不仅不会改变选择的状态,但这并不影响甚至未选中状态。

只有在收到的动作后,我试图改变背景颜色:

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    JToggleButton button = (JToggleButton)e.getSource(); 
    if (button.isSelected()) // alternatively, (Boolean)getValue(Action.SELECTED_KEY) 
    { 
     button.setBackground(Color.RED); 
    } 
} 

这些都不工作。我已经找到工作的唯一的事情需要我来绘制按钮自己处于选中状态(这会导致工作的例子,尽管非标准看):

private class ColoredToggleButton extends JToggleButton 
{ 
    ColoredToggleButton(Action action, Color color) 
    { 
     super(action); 

     setBackground(color); 
    } 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     if (this.isSelected()) 
     { 
      int w = getWidth(); 
      int h = getHeight(); 
      String s = getText(); 

      // selected color 
      g.setColor(getBackground()); 
      g.fillRect(0, 0, w, h); 
      // selected foreground color 
      g.setColor(SystemColor.controlText); 
      g.drawString(s, 
         (w - g.getFontMetrics().stringWidth(s))/2 + 1, 
         (h + g.getFontMetrics().getAscent())/2 - 1); 
     } 
    } 
} 

即略低于评论中修改这Java bug report。有趣的是(有趣?),声称在1998年已被修正。

有没有人知道更好,L & F独立的方式来设置选定JToggleButton的背景颜色?

+0

可以覆盖BasicbuttonUI或只是MetalButtonUI(当时只为金属L&F)有些淡淡的http://stackoverflow.com/questions/5751311/creating-custom-button -in-java/5755124#5755124 – mKorbel 2011-04-27 17:57:44

+0

为什么? LAF应该控制外观,最好让它做到这一点 - 如果干扰成功,你的定制油漆/颜色会像拇指一样突出 – kleopatra 2011-04-27 18:15:17

+0

@kleopatra我通常认为,离开L&F是一种好的做法,但简单地说,这是一个理想的功能。特别是,它实际上意味着坚持下去。 – pickypg 2011-04-27 18:55:10

回答

3

您可能会看到setIcon()是否足以满足您的需求,但您也可以在ButtonUI委托中覆盖paint()

附录:@ kleopatra的评论很好:改变UI代表是而不是琐碎。 @ mKorbel最近的example显示了这种方法的难度和多功能性。其主要优势是看起来&感觉独立。

提到了一些不那么雄心勃勃的方法here

+0

re:实现一个自定义的ButtonUI /子类一个现有的 - 当然,一切皆有可能 - 但并非一切都可行;-)强烈的“不”我。 – kleopatra 2011-04-27 18:17:24

+0

@kleopatra:感谢您的评论;我试图在上面看到这一点。 – trashgod 2011-04-27 18:47:51

+0

@ Jeanette我总是欣赏你在我眼中间的一脚,因为它总是关于(我的)什么是poppycock,但是O​​P可能不想听到它是不可能的,等待来自BugsParade的补丁,然后它倾向于回复你* **创建CustomComponents,如果您对选项setForeground或设置不满意图标 – mKorbel 2011-04-27 19:45:29

5

“ToggleButton.selected”错误,它需要“ToggleButton.select”。 并且应该更新到组件。

UIManager.put("ToggleButton.select", Color.WHITE); 
SwingUtilities.updateComponentTreeUI(togglebuttonname); 
+0

这是一个伟大的捕获,这确实有效!但是,除非您创建自己的实例并为其提供新的'static ComponentUI createUI(JComponent c)',否则会有一个相当大的警告,即它会全局影响所有JToggleButton。因此,我仍然陷入了自己的困境,但对于那些想要全球改变背景颜色的人来说,那么你的方法就是一个可行的解决方案。 – pickypg 2013-03-05 17:49:40

+0

我太兴奋了,拼写错误很好。但是,这不适用于Windows系统的外观和感觉。 – pickypg 2013-03-05 17:56:16

+0

进一步研究,看起来系统L&F甚至没有使用任何与“Color”关联的ToggleButton键(例如“ToggleButton.background”)。 – pickypg 2013-03-05 18:02:20

3
JToggleButton btn = new JToggleButton(...); 
btn.setUI(new MetalToggleButtonUI() { 
    @Override 
    protected Color getSelectColor() { 
     return Color.RED; 
    } 
}); 
1

你可以简单地强制背景颜色各重绘之前 - 对你有改变的paintComponent,检查按钮切换,设置背景取决于切换状态,最后,让超类做实际的油漆工作:

public class ColoredToggleButton extends JToggleButton 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     Color bg; 
     if (isSelected()){ 
      bg = Color.GREEN; 
     } else { 
      bg = Color.RED; 
     } 
     setBackground(bg); 
     super.paintComponent(g); 
    } 
} 
0

如果你宁愿在UI使用操作监听,而不是压倒一切的方法,你可以更改UI的界面没有任何selectColor性能。

这是我最近

使用的例子
private class FavouriteToggle extends JToggleButton { 
    public FavouriteToggle() { 
     setUI(new BasicToggleButtonUI()); //Removes selectColor 

     ////Your Custom L&F Settings//// 
     setBackground(new Color(255, 252, 92)); 
     setForeground(Color.GRAY); 
     setText("Favourite"); 
     setBorder(null); 
     setFocusPainted(false); 

     ////Add your own select color by setting background//// 
     addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       if(((JToggleButton) e.getSource()).isSelected()) { 
        setForeground(Color.BLACK); 
        setBackground(new Color(255, 251, 0)); 
       } else { 
        setBackground(new Color(255, 252, 92)); 
        setForeground(Color.GRAY); 
       } 
      } 
     }); 
    } 
}