2016-03-25 29 views
1

各タブの色が異なるNimbusルックアンドフィールを使用してJTabbedPaneを作成したいとします。色を変更するには複数の方法がありますが、これらの手法は特定の状態のすべてのタブにグローバルに適用されます(TabbedPane:TabbedPaneTab[Enabled].backgroundPainterですべてのタブを同じ色に変更するなど)NimbusのJTabbedPaneタブごとに色が異なる

2つの有用なSO私は(近いが私の質問に答えなく、かなり)を発見したリンク:以下

Override Swing Nimbus L&F primary color per component instance

Set the Background Color for JTabbedPane

私が達成したいもののモックアップ画像です。

enter image description here

*編集 - 申し訳ありませんが、デモプログラムのソースコードを含めるのを忘れていました。 (これは、着色を作成するが、そうでない場合には適切なタブウィンドウで新しいウィンドウを起動しません。):

public class TabbedPaneExample extends JFrame { 
    public static void main(String args[]) { 
     try { 
      for(javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager. 
        getInstalledLookAndFeels()) { 
       if("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
     } 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TabbedPaneExample().setVisible(true); 
      } 
     }); 
    } 

    public TabbedPaneExample(){ 
     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     JTabbedPane pane = new JTabbedPane(); 
     pane.addTab("Blue", new JLabel("Blue tab")); 
     pane.addTab("Red", new JLabel("Red tab")); 
     pane.addTab("Yellow", new JLabel("Yellow tab")); 

     this.add(pane); 

     pack(); 
    } 
} 

*編集 - 以下zilkの答えに関しては - 動作するように表示されません。 BasicTabbedPaneUIを拡張すると、Nimbus固有のレンダリングが失われます。ニンバスレンダリングを維持するには、SynthTabbedPaneUIを拡張する必要があります。ただし、SynthTabbedPaneUIpaintTabBackgroundを呼び出さず、代わりにpaintTabAreaを呼び出します。これは保護されたメソッドとオーバーロードされたプライベートヘルパーメソッドの両方です。プライベートヘルパーメソッドではすべてのロジックが発生するようです。プライベートインスタンス変数がSynthTabbedPaneUIで、パッケージプライベートコードがSynthContextであり、paintTabAreaで使用されているため、自分のコードでそのプライベートメソッドを再現できません。

答えて

0

tabbedpaneに拡張された新しいUIをBasicTabbedPaneUIに設定できます。その後、paintTabBackgroundメソッドをオーバーライドするだけです。ここ 私のコードは enter image description here

P.Sを結果である:編集

pane.setUI(new BasicTabbedPaneUI(){ 
     @Override 
     protected void paintTabBackground(Graphics g, int tabPlacement,int tabIndex, int x, int y, int w, int h, boolean isSelected){ 
      //default backcolor 
      Color bg = Color.LIGHT_GRAY; 

      switch(tabIndex){ 
      case 0: 
        bg = Color.BLUE; 
        break; 
       case 1: 
        bg = Color.YELLOW; 
        break; 
       case 2: 
        bg = Color.RED; 
        break; 
       } 
      g.setColor(bg); 

      switch (tabPlacement){ 
       case SwingConstants.TOP: 
        g.fillRect(x + 1, y + 1, w - 1, h - 1); 
        break; 
       case SwingConstants.BOTTOM: 
        g.fillRect(x, y, w - 1, h - 1); 
        break; 
       case SwingConstants.LEFT: 
        g.fillRect(x + 1, y + 1, w - 1, h - 2); 
        break; 
       case SwingConstants.RIGHT: 
        g.fillRect(x, y + 1, w - 1, h - 2); 
        break; 
       } 
    } 
}); 

このコードを試してみてください。これは、唯一のニンバスのために動作しないように見えるこの

pane.setOpaque(true); 
+0

を忘れないでください。 'BasicTabbedPaneUI'を拡張すると、Nimbus固有のレンダリングが失われます。ニンバスレンダリングを維持するために、 'SynthTabbedPaneUI'を拡張する必要があります。しかし、 'SynthTabbedPaneUI'は' paintTabBackground'を呼び出すのではなく、 'paintTabArea'を呼び出します。これはprotectedメソッドとprivateヘルパーメソッドです。プライベートメソッドではすべてのロジックが発生するように見えますが、私はプライベートインスタンス変数のため再現できません。私はより多くの情報で私の答えを更新します。 –

+0

Nimbusだけが必要な理由は分かりません。そして、実際には、「ニンバスレンダリングを失う/維持する」ということはどういう意味ですか? 私のコードはモックアップとして正しく動作します – ziLk

+0

私たちのアプリケーションはNimbus L&Fを使用しています。 'BasicTabbedPaneUI'を拡張すると、' JTabbedPane'はMetal L&Fの外観を取ります(そしてNimbus L&Fはもうありません)。これにより、アプリケーションでJTabbedPaneの外観が変わってしまいます。ここでは、 'BasicTabbedPaneUI'を使ってカスタム' JTabbedPane'を使って通常のNimbus 'JTabbedPane'を並べて表示するイメージを示します。 http://i.imgur.com/Lv2lmHK.pngコーナー、罫線、グラデーション、および選択ハイライトの外観がどのように異なって表示されるかに注意してください。私はどのように異なるタブの色を達成し、NimbusのL&Fを維持するかを理解することはできません。 –

関連する問題