2011-06-26 30 views
1

我無法找到一種方式(是否有?)來格式化JTabbedPane中標籤標題的風格。Groovy SwingBuilder:控制JTabbedPane中標籤標題的風格

我可以更改選項卡窗格的背景顏色(請參見下文),但無法找到設置選項卡標題樣式的方式;我想讓它們變爲粗體或紅色,或者能夠定義標籤寬度,例如,我可以在第一個面板中格式化標籤的樣式。

下面的代碼,主要是由tim_yates啓發(Groovy SwingBuilder : using a scrollpanel to show a list of panels):

import groovy.swing.SwingBuilder 
import javax.swing.WindowConstants as WC 
import javax.swing.JOptionPane 
import javax.swing.JTabbedPane 
import javax.swing.JScrollPane 
import javax.swing.BoxLayout as BXL 
import java.awt.Font 

Font font = new Font("Serif", Font.BOLD, 13) 
int numPanels = 20 

swing = new SwingBuilder() 
frame = swing.frame(title:'test', pack:true, visible:true, defaultCloseOperation:WC.DISPOSE_ON_CLOSE) { 
    tabbedPane(id: 'tabs', tabLayoutPolicy:JTabbedPane.SCROLL_TAB_LAYOUT) { 
     panel(name: 'Tab 1', background:java.awt.Color.WHITE) { 
      boxLayout(axis: BXL.Y_AXIS) 
      panel(alignmentX: 0f, background:java.awt.Color.WHITE){ 
       label ('Label 1', preferredSize: [104, 24]).setFont(font) 
       label ('Label 2', preferredSize: [104, 24]).setFont(font) 
       label ('Label 3', preferredSize: [104, 24]).setFont(font) 
      } 
      scrollPane(verticalScrollBarPolicy:JScrollPane.VERTICAL_SCROLLBAR_ALWAYS) { 
       vbox(){ 
        (1..numPanels).each { num -> 
         def panelID = "panel$num" 
         def pane = panel(alignmentX:0f, id:panelID, background:java.awt.Color.GREEN) { 
          label('description') 
          textField(id: "description$num", text:panelID, columns: 70) 
          button(id: "buttonpanel$num", text:panelID, actionPerformed:{ 
          swing."$panelID".background = java.awt.Color.RED 
          }) 
         } 
        } 
       } 
      } 
     }  
     panel(name: 'Tab 2', background:java.awt.Color.WHITE) { 
      textField(text: 'Some text', columns: 15) 
      scrollPane() { 
       textArea(text: 'Some text', columns: 15, rows: 4) 
      } 
     }  
    } 
    boxLayout(axis: BXL.Y_AXIS) 
    panel(id:'secondPanel', background:java.awt.Color.WHITE){      
     button('Quit', actionPerformed:{ 
     dispose() 
     }) 
    } 
} 
frame.size = [ frame.width, 600 ] 

我發現這些鏈接看起來非常困難的(我)在Groovy來實現:

而且在Java文檔不解釋如何做到這一點,我沒有找到使用樣式選項卡的任何實例。

感謝您的幫助。

Regards,

Michel。

PS:Ant的提供了一個鏈接

Groovy SwingBuilder : changing size and/or font of tabs (in jTabbedpane)

一個有趣的文章,但我的問題沒有直接幫助的(最初過於模糊)。

回答

2

我相信你需要調用jtabbedpane.setTabComponentAt(在javadoc for which can be found here

這需要你可以使用Java 6(用於Java 5,你將不得不考慮編寫自定義TabbedPaneUI類,並重寫此 - 或使用自定義JTabbedPane類的距離,讓這個其它來源)

下面是它在行動的例子:

import groovy.swing.SwingBuilder 
import javax.swing.WindowConstants as WC 
import javax.swing.JOptionPane 
import javax.swing.JTabbedPane 
import javax.swing.JScrollPane 
import javax.swing.BoxLayout as BXL 
import java.awt.Font 

Font font = new Font("Serif", Font.BOLD, 13) 
int numPanels = 20 

swing = new SwingBuilder() 

frame = swing.frame(title:'test', pack:true, visible:true, defaultCloseOperation:WC.DISPOSE_ON_CLOSE) { 
    vbox { 
     tabbedPane(id: 'tabs', tabLayoutPolicy:JTabbedPane.SCROLL_TAB_LAYOUT) { 
      panel(name:'Tab 1', background:java.awt.Color.WHITE) { 
       vbox { 
        panel(background:java.awt.Color.WHITE){ 
         label ('Label 1', preferredSize: [104, 24]).setFont(font) 
         label ('Label 2', preferredSize: [104, 24]).setFont(font) 
         label ('Label 3', preferredSize: [104, 24]).setFont(font) 
        } 
        scrollPane(verticalScrollBarPolicy:JScrollPane.VERTICAL_SCROLLBAR_ALWAYS) { 
         vbox { 
          (1..numPanels).each { num -> 
           def panelID = "panel$num" 
           def pane = panel(alignmentX:0f, id:panelID, background:java.awt.Color.GREEN) { 
            label('description') 
            textField(id: "description$num", text:panelID, columns: 70) 
            button(id: "buttonpanel$num", text:panelID, actionPerformed:{ 
             swing."$panelID".background = java.awt.Color.RED 
            }) 
           } 
          } 
         } 
        } 
       } 
      }  
      panel(name: 'Tab 2', background:java.awt.Color.WHITE) { 
       textField(text: 'Some text', columns: 15) 
       scrollPane() { 
        textArea(text: 'Some text', columns: 15, rows: 4) 
       } 
      }  
     } 
     panel(id:'secondPanel', background:java.awt.Color.WHITE){      
      button('Quit', actionPerformed:{ 
       dispose() 
      }) 
     } 
    } 
} 

// Define a list of labels for our tabs 
def tabComponents = [ 
    swing.label(text:'Tab 1', font:font.deriveFont(Font.ITALIC)), 
    swing.label(text:'Tab 2', font:font.deriveFont(20.0f)) 
] 
// Set the tab componets to our labels 
tabComponents.eachWithIndex { lbl, idx -> 
    swing.tabs.setTabComponentAt idx, lbl 
} 

frame.size = [ frame.width, 600 ] 

PS:您可能想要刪除您other question,我只是發現...通常編輯一個問題,包括額外的信息比張貼一個新的問題要求同樣的事情,但有更多的信息要好

+0

tyvm,蒂姆!就是我在找的東西。 –

+0

在此期間,我嘗試了這種解決方案:tabbedPane(){} .setFont(font),它適用於設置字體樣式,但無法將其擴展爲自定義寬度或顏色 –

+0

而您的解決方案允許更多的靈活性:def tabComponents = [ swing.label(text:'Tab 1',font:font.deriveFont(Font.ITALIC),foreground:java.awt.Color.RED,preferredSize:[104,24]), swing.label(text:' Tab 2',字體:font.deriveFont(20.0f)) ] –