2013-11-10 34 views
1

Я пытаюсь изменить цвет границы JTabbedPane на основе выбранной вкладки. Используя ответы here и on the web, я сумел это:JTabbedPanel изменить выбранный цвет фона вкладки

import java.awt.*; 

import javax.swing.*; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 
import javax.swing.plaf.basic.BasicTabbedPaneUI; 

public class TabbedPaneTest implements Runnable { 
    JTabbedPane pane = new JTabbedPane();; 

    public void run() { 
     // magenta border first so any changes will be obvious 
     setTabbedPaneBorderColor(new Color(255, 0, 255)); 

     JPanel container = new JPanel(); 
     container.setSize(new Dimension(500, 200)); 
     pane.setPreferredSize(new Dimension(400, 200)); 
     pane.addTab("A", createTab(Color.RED)); 
     pane.addTab("B", createTab(Color.YELLOW)); 
     pane.addTab("C", createTab(Color.BLUE)); 
     pane.addChangeListener(new TabSelected()); 
     container.add(pane); 

     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(container); 
     frame.setSize(500, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private JPanel createTab(Color color) { 
     JPanel p = new JPanel(); 
     p.setBorder(BorderFactory.createLineBorder(color, 2)); 
     return p; 
    } 

    private class TabSelected implements ChangeListener { 

     @Override 
     public void stateChanged(ChangeEvent e) { 
      int index = pane.getSelectedIndex(); 

      switch (index) { 
      case 0: 
       setTabbedPaneBorderColor(Color.RED); 
       break; 
      case 1: 
       setTabbedPaneBorderColor(Color.YELLOW); 
       break; 
      case 2: 
       setTabbedPaneBorderColor(Color.BLUE); 
       break; 
      } 

     } 

    } 

    public void setTabbedPaneBorderColor(Color tabBorderColor) { 

     UIManager.put("TabbedPane.borderHightlightColor", tabBorderColor); 
     UIManager.put("TabbedPane.darkShadow", tabBorderColor); 
     UIManager.put("TabbedPane.shadow", tabBorderColor); 
     UIManager.put("TabbedPane.light", tabBorderColor); 
     UIManager.put("TabbedPane.highlight", tabBorderColor); 
     UIManager.put("TabbedPane.focus", tabBorderColor); 
     UIManager.put("TabbedPane.selectHighlight", tabBorderColor); 


     pane.setUI(new BasicTabbedPaneUI() { 
       @Override 
       protected void installDefaults() { 
        super.installDefaults(); 
        highlight = UIManager.getColor("TabbedPane.light"); 
        lightHighlight = UIManager.getColor("TabbedPane.highlight"); 
        shadow = UIManager.getColor("TabbedPane.shadow"); 
        darkShadow =UIManager.getColor("TabbedPane.darkShadow"); 
        focus = UIManager.getColor("TabbedPane.focus"); 
       } 
      }); 
    } 

    public static void main(String[] args) throws Exception { 
     SwingUtilities.invokeLater(new TabbedPaneTest()); 
    } 
} 

В частности, метод setTabbedPaneBorderColor() делает именно то, что я хотел (то есть, он изменяет фантазии рамку вокруг вкладок, а не на границе с панели, содержащиеся в нем, или сплошная прямоугольная рамка вокруг всего пространства, которое занимает JTabbedPane). По какой-то причине этот пример вызывает ошибку, которая не отображается в моей реальной программе (я думаю, что она связана с SwingWorker и EDT). Теперь я пытаюсь понять, как изменить фон выбранной вкладки.

Соответствующее свойство

UIManager.put("TabbedPane.selected",Color.MAGENTA); 

Однако, я, кажется, не есть способ использовать, что в tabUI (это озадачивает, но нет ни одной переменной фона Цвет в BasicTabbedPaneUI).

Редактировать: Надеюсь, кто-то более осведомленный придет с хорошим ответом, но если вы поймете это в googled, мое текущее решение должно использовать нейтральный цвет для фона фона выбранной вкладки, поскольку, похоже, нет простого способа его обновления. Я также переключился на нейтральную границу вкладки (даже если вы МОЖЕТЕ обновить это, как показывает пример) и создал цветные границы внутри содержащихся JPanels. Это не идеальный вариант, но он выглядит неплохо, и у меня нет времени продолжать поиски более чистого решения на данный момент.

ответ

1

Это работает для меня

  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); 
    } 
    } 
} 
-1

для меня, он работал, я просто установить UIManager в TabbedPane.selected свойство цвета до создания объекта JTabbedPane.

UIManager.put("TabbedPane.selected", Color.red); 

     tabbedPane = new JTabbedPane(); 

Ссылка на эту ссылку, я уверен, что она будет работать и для вас.

http://esus.com/changing-the-color-of-the-selected-tab-of-a-jtabbedpane/

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