2010-01-22 54 views
6

我一直在努力弄清楚這一點。控制Java中的顏色選項卡式窗格

我正在嘗試elimenate出現在JTabbedPane中的淺藍色背景。我嘗試了一切,似乎沒有任何工作。

以下是我的代碼。如果你運行它,它會顯示選項卡,當選擇一個淺藍色背景和頂部的藍色邊框。我想要控制這種顏色。但是如何?

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.plaf.ColorUIResource; 
public class Main extends JFrame { 
    JTabbedPane tab=new JTabbedPane(); 
    public Main() { 
    setSize(300,300); 
    setTitle("Test Tab pane"); 
    tab.add("First",new myPanel("First")); 
    tab.add("Second",new myPanel("Second")); 
    tab.add("Third",new myPanel("Third")); 
    tab.add("Fourth",new myPanel("Fourth")); 
    tab.addChangeListener(new ChangeTab()); 
    getContentPane().add(tab,BorderLayout.CENTER); 
    setVisible(true); 
    for(int i=0;i<tab.getTabCount();i++){ 
      if(i != tab.getSelectedIndex()) 
      tab.setBackgroundAt(i,Color.orange); 
      tab.setForeground(Color.BLACK); 
    } 
    tab.setOpaque(true); 
    UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN); 
    UIManager.put("TabbedPane.selected",ColorUIResource.GREEN); 
    UIManager.put("TabbedPane.background",ColorUIResource.GREEN); 
    UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN); 
    } 

    public static void main(String[] args) { 
    Main main = new Main(); 
    } 

    class ChangeTab implements ChangeListener{ 
    public void stateChanged(ChangeEvent e){ 
     tab.validate(); 
     System.out.println(tab.getSelectedIndex()); 
     for(int i=0;i<tab.getTabCount();i++){ 
      if(i != tab.getSelectedIndex()) 
      tab.setBackgroundAt(i,Color.orange); 
     } 

    } 
    } 

    class myPanel extends JPanel{ 
    public myPanel(String str){ 
     add(new JLabel(str)); 
    } 
    } 

} 
+0

在顯示「JFrame」之前,您是否嘗試過使用不同的LookAndFeel或使用'UIManager.put'? – 2010-01-22 21:51:19

回答

9

我用你的示例代碼,以及什麼工作對我來說是呼叫轉移到UIManager.put()到JTabbedPane的構造函數之前,他們將要執行的點執行。

public class Main extends JFrame { 
    JTabbedPane tab; 

    public Main() { 
     // ... other stuff 
     UIManager.put("TabbedPane.contentAreaColor ",ColorUIResource.GREEN); 
     UIManager.put("TabbedPane.selected",ColorUIResource.GREEN); 
     UIManager.put("TabbedPane.background",ColorUIResource.GREEN); 
     UIManager.put("TabbedPane.shadow",ColorUIResource.GREEN); 

     // now construct the tabbed pane 
     tab=new JTabbedPane(); 

     // ... other stuff 
} 

還有一些可用的其他屬性(用於金屬大號&樓至少):

UIManager.put("TabbedPane.borderColor", Color.RED); 
UIManager.put("TabbedPane.darkShadow", ColorUIResource.RED); 
UIManager.put("TabbedPane.light", ColorUIResource.RED); 
UIManager.put("TabbedPane.highlight", ColorUIResource.RED); 
UIManager.put("TabbedPane.focus", ColorUIResource.RED); 
UIManager.put("TabbedPane.unselectedBackground", ColorUIResource.RED); 
UIManager.put("TabbedPane.selectHighlight", ColorUIResource.RED); 
UIManager.put("TabbedPane.tabAreaBackground", ColorUIResource.RED); 
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.RED); 

這些讓你控制了大部分的顏色在標籤區域。

我發現這些設置的內容仍然有一個非常小的藍色灰色邊框。我已經搜索如何設置這種顏色無濟於事。我能找到的唯一解決辦法是:

UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0)); 

這是一個次優解決方案。

+0

其實,這對我有用。你爲什麼稱之爲次優? – Elliott 2010-01-23 09:41:54

+0

因爲,而且我不確定這一點,它會使標籤的內容正好位於邊緣。例如。如果你有一個組件在那裏,比如北區的一個按鈕,按鈕的頂部將觸摸選項卡的頂部,當你寧願控制顏色時,這可能不是你想要的。 – Grundlefleck 2010-01-23 11:48:10

+0

是的。我想到了這一點,但能夠通過在TabbedPane訪問的容器的內容區域周圍添加邊框來解決它。邊界不是JTabbedPane本身的屬性,而是容器的屬性。該邊界完全由我控制,從而解決了這個問題(雖然不是最優雅的解決方案)。但是,再一次,這個Swing控件的暗示也不是。 – Elliott 2010-01-23 18:29:03

0

嘗試2: 我固定我的邊境問題,改變了外觀和感覺的經理。這仍然是不完全是你在找什麼,但..

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 
import javax.swing.plaf.ColorUIResource; 
public class Main extends JFrame { 
    JTabbedPane tab=new JTabbedPane(); 
    public Main() { 

    setBackground(Color.white); 
    setSize(300,300); 
    setTitle("Test Tab pane"); 
    tab.add("First",new myPanel("First")); 
    tab.add("Second",new myPanel("Second")); 
    tab.add("Third",new myPanel("Third")); 
    tab.add("Fourth",new myPanel("Fourth")); 
    tab.addChangeListener(new ChangeTab()); 
    tab.setBackground(Color.white); 
    tab.setForeground(Color.black); 
    tab.setBorder(BorderFactory.createEmptyBorder()); 


    getContentPane().add(tab,BorderLayout.CENTER); 
    setVisible(true); 

    } 

    public static void main (String[] args) throws Exception { 
          UIManager.setLookAndFeel(
      UIManager.getSystemLookAndFeelClassName()); 
    Main main = new Main(); 
    } 

    class ChangeTab implements ChangeListener{ 
    public void stateChanged(ChangeEvent e){ 
     tab.validate(); 
     System.out.println(tab.getSelectedIndex()); 

    } 
    } 

    class myPanel extends JPanel{ 
    public myPanel(String str){ 
     setBackground(Color.white); 
     setBorder(BorderFactory.createEmptyBorder()); 
     add(new JLabel(str)); 
    } 
    } 

} 
+0

'setBorder()'需要一個javax.swing.border.Border,而不是一個Color對象。是從Border對象中取出的顏色? – Grundlefleck 2010-01-22 22:08:18

+0

有人發佈了答案,但現在它消失了。爲什麼?在Stackoverflow錯誤? anwwer首先在UIManager中設置參數,然後創建對象。反向操作並且代碼不起作用。 – Elliott 2010-01-22 22:22:42

+0

@Elliot:我自己刪除了它,因爲它不能解決你的問題,只是它的一部分。我仍然看到內部面板周圍的藍灰色邊框。即使使用這個答案。 – Grundlefleck 2010-01-22 22:31:25

2

用這些值檢查結果。

UIManager.put("TabbedPane.contentAreaColor", Color.GREEN); 
UIManager.put("TabbedPane.light", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.highlight", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.shadow", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.darkShadow", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.selected", ColorUIResource.GREEN); 
UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.GREEN); 

正如你所看到的,只有這樣,才能得到的面板,您想要的顏色是「borderHightlightColor」設置爲所需顏色的頂部深色邊框。不幸的是,這具有可以看到的副作用(所有標籤周圍的綠色邊框)。而且,綠色背景之間還有這條灰線。

我認爲唯一真正的解決方案是覆蓋你的MetalTabbedPaneUI。如果您只設置contentAreaColor並對方法執行空替代

paintContentBorderTopEdge(g, tabPlacement, selectedIndex, x, y, w, h); 
paintContentBorderLeftEdge(g, tabPlacement, selectedIndex, x, y, w, h); 
paintContentBorderBottomEdge(g, tabPlacement, selectedIndex, x, y, w, h); 
paintContentBorderRightEdge(g, tabPlacement, selectedIndex, x, y, w, h); 

結果應該接近我懷疑您想獲得的結果。

相關問題