Groovy SwingBuilder: управление стилем заголовков вкладок в JTabbedPane
Я не могу найти способ (есть ли какой-нибудь?) Форматировать стиль заголовков вкладок в JTabbedPane.
Я могу изменить цвет фона панелей вкладок (см. Ниже), но не могу найти способ стилизации заголовков вкладок; Я хотел бы, чтобы они были выделены жирным или красным цветом, или, например, я мог бы определять ширину вкладок, как если бы я мог форматировать стиль надписей на первой панели.
Вот код, в основном вдохновленный tim_yates ( Groovy SwingBuilder: использование панели прокрутки для отображения списка панелей):
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: Муравей предложил ссылку
Groovy SwingBuilder: изменение размера и / или шрифта вкладок (в jTabbedpane)
на интересную статью, но не является непосредственно полезным для моего вопроса (изначально слишком расплывчато).
1 ответ
Я считаю, что вам нужно позвонить jtabbedpane.setTabComponentAt
( Javadoc, для которого можно найти здесь)
Для этого необходимо, чтобы вы использовали 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: Возможно, вы захотите удалить другой вопрос, который я только что нашел... Вообще редактирование вопроса с включением дополнительной информации лучше, чем публикация нового вопроса, задающего то же самое, но с дополнительной информацией.