实战 Groovy(五)- 添加结果面板

实战 Groovy(5)- 添加结果面板

如清单 13 所示,像对待 searchPanel 那样,在嵌套的闭包中定义 resultsPanel。但是,这一次在这个面板中嵌套另一个容器:JScrollPane。这个组件可以根据需要显示和隐藏水平和垂直滚动条。Search.byKeyword() 方法调用的结果显示在名为resultsList 的 JList 中。(JList.setListData() 方法接受一个 Object[] — 这就是 Search.byKeyword() 方法返回的结果)。


清单 13. 添加 resultsPanel 
				
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*

class Gwitter{   
  def searchField
  def resultsList
  
  static void main(String[] args){
    def gwitter = new Gwitter()
    gwitter.show()
  }
    
  void show(){
    def swingBuilder = new SwingBuilder()  
    
    def customMenuBar = {
      swingBuilder.menuBar{
        menu(text: "File", mnemonic: 'F') {
          menuItem(text: "Exit", mnemonic: 'X', actionPerformed: {dispose() })
        }
      }  
    }    

    def searchPanel = {
      swingBuilder.panel(constraints: BorderLayout.NORTH){
        searchField = textField(columns:15)
        button(text:"Search", actionPerformed:{ 
          resultsList.listData = Search.byKeyword(searchField.text) } )
      }
    }
    
    def resultsPanel = {
      swingBuilder.scrollPane(constraints: BorderLayout.CENTER){
        resultsList = list()
      }
    }    
    
    swingBuilder.frame(title:"Gwitter", 
                       defaultCloseOperation:JFrame.EXIT_ON_CLOSE, 
                       size:[400,500],
                       show:true) {
      customMenuBar()                         
      searchPanel()
      resultsPanel()
    }    
  }  
}

注意,与 searchField 一样,resultsList 变量是在类级定义的。searchPanel 中按钮的 actionPerformed 处理函数使用这两个变量。

添加 resultsPanel 之后,Gwitter 现在有实际功能了。在命令提示上输入 groovy Gwitter,检查它是否工作正常。搜索 thirstyhead应该会产生图 5 所示的结果:


图 5. 搜索结果
实战 Groovy(五)- 添加结果面板 

现在可以宣布成功了,但是我想先解决两个问题。第一个问题是搜索按钮的 actionPerformed 处理函数可能会引起线程问题。另一个问题是这个应用程序太一般了。下面两节解决这些问题。


更新的详细信息请参考  java进阶网 www.javady.com