Groovy Swingbuilder:如何创建动态菜单
Groovy Swingbuilder: How do I create dynamic menus
我正在通过从磁盘读取目录并为该目录中的每个文件创建一个 menuItem 来创建菜单。
我想让它在每次单击该菜单时重新读取磁盘。
SwingBuilder 似乎不想这样做——至少不容易。
我是否必须向 "Menu" 添加闭包以使用老式 swing 创建 MenuItems(我什至不知道这是否可行,因为您已经单击了菜单),或者是否有一些技巧可以让 SwingBuilder 在输入某个部分时重新评估该部分?
这是我现在拥有的:
File scriptDir = new File("C:/myBatchFiles")
menu(text:"External tools", visible:scriptDir.isDirectory()) {
scriptDirlistFiles().each{
File oneItem ->
String name = oneItem.name
String command = '"' + scriptDir.path + '/' + name + '"'
menuItem(action(name:name){MyUtils.cmd(command)}
}
}
您应该能够适应以下内容:
import groovy.swing.*
import javax.swing.event.*
new SwingBuilder().edt {
def fillMenu = { ->
scripts.removeAll()
new File('/tmp').listFiles().each {
scripts.add(menuItem(text: it.name))
}
}
frame(title: 'Testing', size: [800, 600], visible:true) {
menuBar {
menu(id:'scripts', text: 'External Scripts')
}
}
scripts.addMenuListener([ menuCanceled: { e -> },
menuDeselected: { e -> },
menuSelected: { e -> fillMenu() } ] as MenuListener)
}
我正在通过从磁盘读取目录并为该目录中的每个文件创建一个 menuItem 来创建菜单。
我想让它在每次单击该菜单时重新读取磁盘。
SwingBuilder 似乎不想这样做——至少不容易。
我是否必须向 "Menu" 添加闭包以使用老式 swing 创建 MenuItems(我什至不知道这是否可行,因为您已经单击了菜单),或者是否有一些技巧可以让 SwingBuilder 在输入某个部分时重新评估该部分?
这是我现在拥有的:
File scriptDir = new File("C:/myBatchFiles")
menu(text:"External tools", visible:scriptDir.isDirectory()) {
scriptDirlistFiles().each{
File oneItem ->
String name = oneItem.name
String command = '"' + scriptDir.path + '/' + name + '"'
menuItem(action(name:name){MyUtils.cmd(command)}
}
}
您应该能够适应以下内容:
import groovy.swing.*
import javax.swing.event.*
new SwingBuilder().edt {
def fillMenu = { ->
scripts.removeAll()
new File('/tmp').listFiles().each {
scripts.add(menuItem(text: it.name))
}
}
frame(title: 'Testing', size: [800, 600], visible:true) {
menuBar {
menu(id:'scripts', text: 'External Scripts')
}
}
scripts.addMenuListener([ menuCanceled: { e -> },
menuDeselected: { e -> },
menuSelected: { e -> fillMenu() } ] as MenuListener)
}