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

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

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

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

панель прокрутки {

  • флажок | элемент1 | кнопка1 | кнопка1 | метка1 | метка1
  • флажок | пункт2 | кнопка2 | кнопка2 | метка2 | метка2
  • флажок | элемент3 | кнопка3 | кнопка3 | метка3 | этикетка3

    [ ... ]

}

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

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

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

Тиа. Мишель


person Michel Parmentier    schedule 22.06.2011    source источник


Ответы (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 ]
person tim_yates    schedule 22.06.2011
comment
Вау ! снова первоклассный ответ; работал из коробки! Еще больше я ценю то, что искал и экспериментировал часами. тывм ! - person Michel Parmentier; 23.06.2011
comment
Какая польза от alignmentX здесь? Что он делает на самом деле? - person Ant's; 23.06.2011
comment
@Ant Это часть макета блока для двух панелей (одна с полосой прокрутки, а другая с кнопкой выхода). Вы можете избавиться от alignmentX: 0f, строки boxLayout(axis: BXL.Y_AXIS) и заменить panel(id:'mainPanel') на vbox(id:'mainPanel'), и я полагаю, что вы получите ту же функциональность. Именно в этом коде, как и в оригинале вопрос, и я не изменил больше, чем должен был - person tim_yates; 23.06.2011