import java.util.Map import javax.swing.* import javax.swing.GroupLayout.Alignment import javax.swing.LayoutStyle.ComponentPlacement import groovy.swing.SwingBuilder import groovy.swing.factory.LayoutFactory import groovy.util.FactoryBuilderSupport /** * GroupLayoutをSwingBuilderから使うデモ * @author hayami * */ /** * 引数にContainerが必要なLayoutManagerをSwingBuilderから使うためのFactory * @author hayami * */ public class TargetLayoutFactory extends LayoutFactory { /** * コンストラクタ * @param clazz 作成するLayoutManagerのクラス */ public TargetLayoutFactory(Class clazz) { super(clazz) } /* (非 Javadoc) * @see groovy.swing.factory.LayoutFactory#newInstance(groovy.util.FactoryBuilderSupport, java.lang.Object, java.lang.Object, java.util.Map) */ public Object newInstance(FactoryBuilderSupport builder, Object name, Object value, Map attributes) { //引数を指定してクラスのインスタンスを作成 return beanClass.newInstance(getLayoutTarget(value)) } } //SwingBuilderの作成 SwingBuilder swing = new SwingBuilder() //GroupLayoutをSwingBuilderに登録 swing.registerFactory("groupLayout", new TargetLayoutFactory(GroupLayout.class)) //GroupLayout GroupLayout layout //ScrollPaneはidの設定ができない? def scrollpane //リストの表示項目一覧 def names = [ 'Bugs Bunny', 'Sylvester Cat', 'Wile Coyote', 'Tasmanian Devil', 'Daffy Duck', 'Elmer Fudd', 'Pepe Le Pew', 'Marvin Martian' ] //SwingBuilderでフレームを作成 def frame = swing.frame(defaultCloseOperation: JFrame.EXIT_ON_CLOSE, pack: true) { //GroupLayoutをレイアウトマネージャに layout = groupLayout(current) //名前リストをScrollPane付きで作成 scrollpane = scrollPane() { list(items: names) } //各部品をid付きで一旦作成しておき、後でレイアウトする label(id:"lastNameLabel", text:"Last Name:") textField(id:"lastNameField", text:"Martian") label(id:"firstNameLabel", text:"First Name:") textField(id:"firstNameField", text:"Marvin") label(id:"phoneLabel", text:"Phone:") textField(id:"phoneField", text:"805-876-5432") label(id:"emailLabel", text:"Email:") textField(id:"emailField", text:"marvin@wb.com") label(id:"address1Label", text:"Address 1:") textField(id:"address1Field", text:"1001001010101 Martian Way") label(id:"address2Label", text:"Address 2:") textField(id:"address2Field", text:"Suite 10111011") label(id:"cityLabel", text:"City:") textField(id:"cityField", text:"Ventura") label(id:"stateLabel", text:"State:") textField(id:"stateField", text:"CA") label(id:"countryLabel", text:"Country:") textField(id:"countryField") label(id:"postalLabel", text:"Postal Code:") textField(id:"postalField", text:"93001") button(id:"newButton", text:"New") button(id:"cancelButton", text:"Cancel") button(id:"deleteButton", text:"Delete") button(id:"editButton", text:"Edit") button(id:"saveButton", text:"Save") //レイアウトの設定 layout.setAutoCreateGaps(true) layout.setAutoCreateContainerGaps(true) // layout.setHorizontalGroup(layout.createSequentialGroup() .addComponent(scrollpane, GroupLayout.DEFAULT_SIZE, 130, Short.MAX_VALUE) .addPreferredGap(ComponentPlacement.UNRELATED).addGroup( layout.createParallelGroup() .addGroup( layout.createSequentialGroup().addGroup( layout.createParallelGroup(Alignment.TRAILING) .addComponent(lastNameLabel).addComponent(phoneLabel) .addComponent(address1Label) .addComponent(address2Label).addComponent(cityLabel) .addComponent(stateLabel).addComponent(countryLabel) ) .addGroup( layout.createParallelGroup() .addComponent(address1Field).addComponent(address2Field).addGroup( layout.createSequentialGroup().addGroup( layout.createParallelGroup().addComponent(lastNameField) .addComponent(phoneField).addComponent(cityField) .addComponent(stateField).addComponent(countryField) ) .addGroup( layout.createParallelGroup(Alignment.LEADING).addGroup( layout.createSequentialGroup().addComponent(firstNameLabel) .addComponent(firstNameField) ) .addGroup( layout.createSequentialGroup().addComponent(emailLabel) .addComponent(emailField) ) .addGroup( layout.createSequentialGroup().addComponent(postalLabel) .addComponent(postalField) ) ) ) ) ) .addGroup(Alignment.TRAILING, layout.createSequentialGroup() .addComponent(newButton).addComponent(deleteButton) .addComponent(editButton).addComponent(saveButton) .addComponent(cancelButton) ) ) ) // layout.linkSize(SwingConstants.HORIZONTAL, cancelButton, deleteButton, editButton, newButton, saveButton) // layout.setVerticalGroup(layout.createParallelGroup() .addComponent(scrollpane).addGroup( layout.createSequentialGroup().addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(lastNameLabel).addComponent(lastNameField) .addComponent(firstNameLabel).addComponent(firstNameField) ) .addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(phoneLabel).addComponent(phoneField) .addComponent(emailLabel).addComponent(emailField) ) .addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(address1Label).addComponent(address1Field) ) .addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(address2Label).addComponent(address2Field) ) .addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(cityLabel).addComponent(cityField) ) .addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(stateLabel).addComponent(stateField) .addComponent(postalLabel).addComponent(postalField) ) .addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(countryLabel).addComponent(countryField) ) .addPreferredGap(ComponentPlacement.UNRELATED) .addGroup( layout.createParallelGroup(Alignment.BASELINE) .addComponent(newButton).addComponent(cancelButton) .addComponent(deleteButton).addComponent(editButton) .addComponent(saveButton) ) ) ) } //フレームの表示 frame.setVisible(true)