2016-03-25 16 views
1

Her bir sekme için farklı renklere sahip Nimbus Look ve Feel kullanarak bir JTabbedPane oluşturmak istiyorum. Renkleri değiştirmenin birden çok yolunu buldum, ancak anlayabildiğim kadarıyla, bu teknikler belirli bir duruma sahip tüm sekmeler için (aynı renkte olmak üzere TabbedPane:TabbedPaneTab[Enabled].backgroundPainter ile tüm sekmelerin değiştirilmesi gibi) global olarak geçerlidir.JTabbedPane Nimbus'ta her sekme için farklı renklere sahip

İki yararlı linkler I (soruma oldukça cevabı yakın ama değil) bulduk: Aşağıda

Override Swing Nimbus L&F primary color per component instance

Set the Background Color for JTabbedPane

Ben başarmak istiyorum ne mockup resimdir.

enter image description here

* edit - üzgünüm demo program kaynak kodunu dahil unuttum. (Bu renklendirme oluşturmak ama aksi uygun sekme bölmesinde ile yeni bir pencere açmaktadır değildir.):

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

* Düzenleme - aşağıdaki Zilk cevabı gelince - işe görünmüyor. BasicTabbedPaneUI'u genişletmek, Nimbus'a özgü oluşturma işleminin kaybolmasına neden olur. Nimbus renderini korumak için, SynthTabbedPaneUI'un uzatılması gerekiyor. Ancak, SynthTabbedPaneUI, paintTabBackground'u çağırmaz; bunun yerine, hem korumalı bir yöntem hem de aşırı yüklenmiş özel bir yardımcı yöntem olan paintTabArea'u çağırır. Özel mantık yönteminde tüm mantık gibi görünüyor. Kendi özel kodumda kendi kodumda SynthTabbedPaneUI özel örnek değişkenleri ve SynthContext özel kod paketini kullanıyorum, bu paintTabArea tarafından kullanılıyor.

cevap

0

Sekmeli bölmeniz için BasicTabbedPaneUI genişletilmiş yeni UI'yi ayarlayabilirsiniz. Bundan sonra, paintTabBackground yöntemini geçersiz kılmanız gerekir. Bu kodları

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

Edit deneyin: Bu sadece Nimbus için çalışmaz görünen bu

pane.setOpaque(true); 
+0

Unutma: İşte benim kodları enter image description here

P.S. neden olduğunu. 'BasicTabbedPaneUI' öğesini genişletmek, Nimbus'a özgü oluşturma işleminin kaybolmasına neden olur. Nimbus renderini korumak için 'SynthTabbedPaneUI' genişletilmeli. Ancak, 'SynthTabbedPaneUI', paintTabBackground işlevini çağırmaz, bunun yerine korumalı bir yöntem ve özel bir yardımcı yöntem olan paintTabArea işlevini çağırır. Tüm mantık özel yöntemde ortaya çıkar ve özel örnek değişkenler nedeniyle bunu yeniden oluşturamıyorum. Cevabımı daha fazla bilgi ile güncelleyeceğim. –

+0

Neden sadece Nimbus için buna ihtiyacın olduğunu anlamıyorum. Ve aslında "Nimbus rendering'i kaybetme/tutma" hakkında ne düşünüyorsunuz? Kodlarım, modelinize uygun şekilde çalışıyor – ziLk

+0

Uygulamalarımız Nimbus L & F'yi kullanıyor. 'BasicTabbedPaneUI' genişletirken, 'JTabbedPane' Metal L & F'nin görünümünü alır (ve artık Nimbus L & F'ye sahip değildir). Bu, 'JTabbedPane' uygulamasındaki yerinde görünmüyor. İşte, normal Nimbus 'JTabbedPane'ı' BasicTabbedPaneUI' kullanarak özel 'JTabbedPane' ile yan yana gösteren bir görüntü. http://i.imgur.com/Lv2lmHK.png Köşeler, kenarlar, degradeler ve seçim vurgularının görünümü farklı görünür. Farklı sekme renklerini nasıl elde edeceğimi ve Nimbus L & F'yi nasıl tutacağımı anlayamıyorum. –