2010-06-26 7 views
2

Я использую JTabbedPane в своем приложении. Я добавил две вкладки, которые являются экземплярами пользовательского класса «ContentPanel». Это расширяет JPanel и устанавливает фон, границу и т. Д. В основном это означает, что мне не нужно устанавливать свойства каждого JPanel, к которому я хочу применить эту цветовую схему. Я заметил, что не только появляется их граница, но и другая граница (которая, я думаю, синяя - по крайней мере на моем экране) появляется вокруг этой границы, подключенной непосредственно к вкладке «селектора» (т.е. кнопки, на которые вы нажимаете, чтобы получить соответствующий вид). Я хотел бы изменить эту границу, поскольку она просто выглядит странно против золотой/коричневой цветовой схемы. Кто-нибудь знает, как это сделать? Я пробовал JTabbedPane.setBorder (Border b), но это не работает. Это просто устанавливает границу вокруг всего объекта, включая селекторы вкладок .. не то, что я хочу.JTabbedPane - установить границу по умолчанию вокруг вкладок ..?

Любая помощь с этим была бы весьма признательна.

ответ

12

Эти цвета определены в Look and Feel. Если вы посмотрите на код для BasicTabbedPaneUI, вы заметите, что installDefaults() устанавливает набор переменных экземпляра protected Color. Ключи, которые они определены в L & F, также доступны здесь.

protected void installDefaults() { 
    LookAndFeel.installColorsAndFont(tabPane, "TabbedPane.background", 
           "TabbedPane.foreground", "TabbedPane.font");  
    highlight = UIManager.getColor("TabbedPane.light"); 
    lightHighlight = UIManager.getColor("TabbedPane.highlight"); 
    shadow = UIManager.getColor("TabbedPane.shadow"); 
    darkShadow = UIManager.getColor("TabbedPane.darkShadow"); 
    //... 
    // a lot more stuff 
    //... 
} 

Если вы не хотите пойти так далеко, как определить свой собственный L & F, у вас есть возможность установить делегат пользовательского интерфейса на вашу вкладки панели:

myTabbedPane.setUI(new BasicTabbedPaneUI() { 
    @Override 
    protected void installDefaults() { 
     super.installDefaults(); 
     highlight = Color.pink; 
     lightHighlight = Color.green; 
     shadow = Color.red; 
     darkShadow = Color.cyan; 
     focus = Color.yellow; 
    } 
}); 

вы, конечно, можете хотите изменить эти настройки цвета. Как установлено, вы увидите, какие вары используются там где.

+0

Да, это похоже на то, что мне нужно .. спасибо. Повторите комментарий, если у меня возникнут проблемы. Richard – ClarkeyBoy

+0

hmm похоже работает, но не полностью. Я просмотрел все переменные для BasicTabbedPaneUI и установил все цвета, перечисленные там, но там есть еще немного более тонкая светло-синяя/бирюзовая рамка. Это тот же цвет, что и вкладка «селектора» .. – ClarkeyBoy

+3

Решил - я нашел кого-то elses thread, который сказал использовать UIManager.put («TabbedPane.contentBorderInsets», новые вставки (0, 0, 0, 0)) ; как вы делаете. Теперь я полностью избавился от границы. Еще раз спасибо. Ричард – ClarkeyBoy

1

Ничего не влияет на L & Решение для системного времени F и JVM для всей системы.

Создайте свой собственный класс с вкладками и вложенный класс tabbed-pane-UI, чтобы решить проблему для «конкретного» класса вкладки. Приведенный ниже код является оригинальным: (. Последний ответ был 2010, но это может быть полезно тоже)

public class DisplayTabbedPane extends JTabbedPane implements 
    MouseListener, ChangeListener { 

    public DisplayTabbedPane() { 

     setTabPlacement(SwingConstants.BOTTOM); 

     // UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); 
     // works but is a JVM system wide change rather than a specific change 
     NoInsetTabbedPaneUI ui = new NoInsetTabbedPaneUI(); 

     // this will build the L&F settings for various tabbed UI components. 
     setUI(ui); 

     // override the content border insets to remove the tabbed-pane 
     // blue border around the pane 
     ui.overrideContentBorderInsetsOfUI(); 

    } 

    /** 
    * Class to modify the UI layout of tabbed-pane which we wish to override 
    * in some way. This modification only applies to objects of this class. 
    * Doing UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); 
    * would affect all tabbed-panes in the JVM run-time. 
    * 
    * This is free to use, no copyright but is "AS IS". 
    */ 
    class NoInsetTabbedPaneUI extends MetalTabbedPaneUI { 
     /** 
     * Create tabbed-pane-UI object to allow fine control of the 
     * L&F of this specific object. 
     */ 
     NoInsetTabbedPaneUI(){ 
      super(); 
     } 
     /** 
     * Override the content border insets of the UI which represent 
     * the L&F of the border around the pane. In this case only care 
     * about having a bottom inset. 
     */ 
     public void overrideContentBorderInsetsOfUI(){ 
      this.contentBorderInsets.top = 0; 
      this.contentBorderInsets.left = 0; 
      this.contentBorderInsets.right = 0; 
      this.contentBorderInsets.bottom = 2;   
     } 
    } 
    ........ 

} 
0

Изменить выглядеть и чувствовать себя с "UIManager"

  UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+MouseOver].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Enabled+Pressed].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Focused+Selected].backgroundPainter", new BackgroundPainter(Color.GRAY)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[MouseOver+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Pressed+Selected].backgroundPainter", new BackgroundPainter(Color.white)); 
      UIManager.getLookAndFeelDefaults().put("TabbedPane:TabbedPaneTab[Selected].backgroundPainter", new BackgroundPainter(Color.white)); 

BackgroundPainter класса

public class BackgroundPainter implements Painter<JComponent> { 

private Color color = null; 

BackgroundPainter(Color c) { 
    color = c; 
} 

@Override 
public void paint(Graphics2D g, JComponent object, int width, int height) { 
    if (color != null) { 
     g.setColor(color); 
     g.fillRect(0, 0, width - 1, height - 1); 
    } 
} 

}

Смежные вопросы