【问题标题】:Groovy SwingBuilder : controlling the style of the tabs titles in JTabbedPaneGroovy SwingBuilder:控制 JTabbedPane 中选项卡标题的样式
【发布时间】:2011-06-26 09:52:36
【问题描述】:

我找不到在 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 文档也没有解释如何做到这一点,我也没有找到任何使用样式标签的示例。

感谢您的帮助。

问候,

米歇尔。

PS : Ant 提供了一个链接

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

到一篇有趣的文章,但对我的问题没有直接帮助(最初太模糊)。

【问题讨论】:

    标签: groovy coding-style tabs jtabbedpane swingbuilder


    【解决方案1】:

    相信您需要致电jtabbedpane.setTabComponentAtjavadoc 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... 通常编辑一个问题以包含额外信息比发布一个新问题来询问相同的问题但包含更多信息

    【讨论】:

    • tyvm,蒂姆!正是我想要的。
    • 与此同时,我尝试了这个解决方案:tabbedPane() { }.setFont(font) 可以正常设置字体样式,但无法将其扩展为自定义宽度或颜色
    • 而您的解决方案允许更大的灵活性: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:font.deriveFont( 20.0f ) ) ]
    • 关于你的 PS,我找不到删除第一个帖子的选项。我想我选择创建一个新帖子是因为很难编辑第一个帖子。
    • @Michel Ahhh,很公平 :-) 下次记得很好 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2010-12-19
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多