Groovy SwingBuilder: использование панели прокрутки для отображения списка панелей

Я хотел бы показать список панелей, содержащих компоненты, то есть флажок, метки, кнопки, все на одной горизонтальной линии; каждая панель представляет один набор компонентов для отображения информации для одного элемента. Мне нужно поместить список панелей (количество не определено) внутри панели прокрутки, чтобы они соответствовали высоте основной панели.

Я не могу найти решение для смешивания панели прокрутки и панелей с компонентами.

Я хотел бы получить этот результат:

scrollpanel {

  • флажок | item1 | button1 | button1 | label1 | label1
  • флажок | item2 | button2 | button2 | label2 | label2
  • флажок | item3 | button3 | button3 | label3 | Метка3

    [...]

}

Вот рабочий пример того, что я сейчас показал здесь: Groovy SwingBuilder: кнопка для изменения цвета панели

Там вы можете увидеть 6 предметов, каждый со своими соответствующими компонентами. Теперь, если бы я хотел отобразить 60 элементов вместо 6, рамка расширилась бы, чтобы соответствовать им, но превысила бы размер экрана.

Мне кажется настолько очевидным, что подобная "панель прокрутки" справилась бы с работой, но я не могу заставить ее работать, хотя я проверил все примеры на уроках Java и связанные с ними вопросы здесь.

ТИА. Мишель

1 ответ

Решение

Вы можете поместить панели внутри vbox, который, в свою очередь, вы положили внутрь scrollPane,

Взяв код из предыдущего вопроса, вы получите что-то вроде этого:

import groovy.swing.SwingBuilder
import javax.swing.WindowConstants as WC
import javax.swing.JOptionPane
import javax.swing.JScrollPane
import javax.swing.BoxLayout as BXL

int numPanels = 20

swing = new SwingBuilder()
frame = swing.frame(title:'test', pack:true, visible:true, defaultCloseOperation:WC.HIDE_ON_CLOSE) {
  panel(id:'mainPanel'){
    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
            } )
          }
        }
      }
    }

    boxLayout(axis: BXL.Y_AXIS)
    panel(id:'secondPanel' , alignmentX: 0f){                       
      button('Quit', actionPerformed:{
        frame.visible = false
      })
    }
  }       
}
frame.size = [ frame.width, 600 ]
Другие вопросы по тегам