2014年8月31日日曜日

SwingBuilderでマウスホバー時にラベルの色を変更する

SwingBuilderでマウスホバー時にラベルの色を変更するには、以下のコードの様にmouseEntered/mouseExitedを使用します。
サンプルコード
import java.awt.*
import javax.swing.*
import groovy.swing.*

sb = new SwingBuilder()
sb.edt {
  frame(
    title: "example - label color when mouse over",
    show: true,
    resizable: true,
    pack: true,
    defaultCloseOperation: WindowConstants.EXIT_ON_CLOSE
  ){
    label(id:"lbl1", text:"example label2",
      // 文字列の色
      foreground: new Color(0xcc, 0xdd, 0xff),
      // 背景色(背景色を設定する場合はopaque=trueにする)
      background: new Color(0x00, 0x00, 0x00),
      opaque:true,
      // マウスホバー時
      mouseEntered: { lbl1.setBackground(Color.WHITE) },
      // マウスがラベル上から出た場合
      mouseExited: { lbl1.setBackground(new Color(0x80, 0x80, 0x80)) },
      constraints: BorderLayout.CENTER,
      font: new Font("Serif", Font.BOLD, 32)
     )
  }
}
実行時画面

動作環境
groovy 2.2.2, JDK 1.7 update55

2014年8月29日金曜日

Raspberry pi上のgroovyでCPU温度・電圧を取得する

Raspberry pi上のgroovyでCPU温度・電圧を取得するには、以下のコードのようにSystemInfoのgetCpuTemperature()とgetCpuVoltage()を使用します。

@Grab(group='com.pi4j', module='pi4j-core', version='0.0.5')
import com.pi4j.system.*

println "cpu architecture:${SystemInfo.getCpuArchitecture()}"
println "cpu temperature:${SystemInfo.getCpuTemperature()}"
println "cpu voltage:${SystemInfo.getCpuVoltage()}"
実行結果
cpu architecture:7
cpu temperature:56.2
cpu voltage:1.2

2014年8月28日木曜日

Apache Commons CSVとgroovyでNULL文字を含むCSVデータを読み込む

Apache Commons CSVとgroovyでNULL文字を含むCSVデータを読み込む場合、以下のコードのようにwithNullString()を使用します。

import org.apache.commons.csv.*

def fmt = CSVFormat.EXCEL
  .withHeader()
  .withNullString("") // 空文字をnullとして取り扱う
for(record in fmt.parse(new FileReader("data-with-null.csv"))){
  for(value in record){
    println value
  }
  println "----"
}

2014年8月22日金曜日

Raspberry pi上のgroovyでモデル名称・シリアル番号を取得する

Raspberry pi上のgroovyでモデル名称・シリアル番号を取得するには、以下のコードのようにSystemInfoのgetBoardType()とgetSerial()を使用します。

@Grab(group='com.pi4j', module='pi4j-core', version='0.0.5')
import com.pi4j.system.*

println "board type:${SystemInfo.getBoardType().name()}"
println "serial:${SystemInfo.getSerial()}"
実行結果
board type:ModelB_Rev2
serial:00000000XXXXXXXX

2014年8月21日木曜日

Apache Commons CSVとgroovyでヘッダー行を読み飛ばしてCSVデータを読み込む

Apache Commons CSVとgroovyでヘッダー行を読み飛ばしてCSVデータを読み込むには、以下のコードを実行します。

import org.apache.commons.csv.*

def fmt = CSVFormat.EXCEL
  .withHeader()
for(record in fmt.parse(new FileReader("data-with-header.csv"))){
  for(value in record){
    println value
  }
  println "----"
}

2014年8月17日日曜日

SwingBuilderでテキストペインでHTMLを表示する

SwingBuilderでテキストペインでHTMLを表示するには、以下のコードの様にtextPaneを使用します。
サンプルコード
import java.awt.*
import javax.swing.*
import groovy.swing.*

sb = new SwingBuilder()
sb.edt {
  frame(
    title: "example - text pane",
    show: true,
    resizable: true,
    size: [300, 200],
    defaultCloseOperation: WindowConstants.EXIT_ON_CLOSE
  ){
    scrollPane(){
      textPane(id:"tp1", contentType:"text/html", editable:false,
        text:"""example<br><div bgcolor="#7799dd"><span color="white">line1</span></div><div bgcolor="#ccddff">line2</div>""",
        constraints: BorderLayout.CENTER
      )
    }
    button(text:"OK", constraints: BorderLayout.SOUTH,
      actionPerformed: {
        sb.optionPane(
          message:"textarea=${sb.tp1.text}",
          messageType:JOptionPane.INFORMATION_MESSAGE)
          .createDialog("textarea").visible = true
      }
    )
  }
}

実行時画面

動作環境
groovy 2.2.2, JDK 1.7 update55

2014年7月16日水曜日

JGraphXでユーザー情報を含んだ図形の保存・ロードを行う

JGraphXでユーザー情報を含んだ図形の保存・ロードを行うには、以下のコードのようにmxXmlUtils, mxCodecクラスを使用します。また、mxGraphのconvertValueToStringメソッド・cellLabelChangedメソッドもオーバーライドします。

サンプルコード
import java.awt.*
import java.awt.event.*
import javax.swing.*
import groovy.swing.*
import com.mxgraph.swing.*
import com.mxgraph.view.*
import com.mxgraph.model.*
import com.mxgraph.util.mxXmlUtils
import com.mxgraph.util.mxConstants
import com.mxgraph.io.*
import org.w3c.dom.*

def graph = new mxGraph()
def mxgc = new mxGraphComponent(graph)


parent = graph.getDefaultParent()
graph.model.beginUpdate()
try
{
  def v1 = graph.insertVertex(parent, null, [label:"処理1", lang:"groovy"],
    20, 20, 50, 30, "style1")
  def v2 = graph.insertVertex(parent, null, [label:"処理2", lang:"SQL"],
    170, 20, 50, 30, "style2")
  def v3 = graph.insertVertex(parent, null, [label:"処理3", lang:"shell"],
    320, 20, 50, 30, "style3")

  graph.insertEdge(parent, null, "正常終了", v1, v2)
  graph.insertEdge(parent, null, "正常終了", v2, v3)

}
finally
{
  graph.model.endUpdate()
}
// モデルの書き込み
def codec = new mxCodec()
def xml = mxXmlUtils.getXml(codec.encode(graph.getModel()))
new File("output.xml").write(xml, "UTF-8")

// モデルの読み込みと表示
def mxgc2
def graph2 = new mxGraph(){
  @Override
  public String convertValueToString(Object cell)
  {
    if( cell instanceof mxCell ){
      if( cell.value instanceof Map ){
        return cell.value.label
      }
    }
    return super.convertValueToString(cell)
  }

  @Override
  public void cellLabelChanged(Object cell, Object newVal, boolean autoSize)
  {
    if( cell instanceof mxCell ){
      if( cell.value instanceof Map ){
        cell.value.label = newVal.toString()
        println cell.value.label
        mxgc2.refresh()
        return
      }
    }
    super.cellLabelChanged(cell, newVal, autoSize)
  }

}
mxgc2 = new mxGraphComponent(graph2)

sb = new SwingBuilder()
def frm = sb.frame(
  title: "JGraphX - save and load",
  visible: true,
  size: [400, 150],
  resizable: true,
  show:true,
  contentPane: mxgc2,
  defaultCloseOperation: WindowConstants.EXIT_ON_CLOSE
){
  def document = mxXmlUtils.parseXml(new File("./output.xml").getText("UTF-8"))
  codec.decode(document.getDocumentElement(), graph2.getModel())

  // 読み込んだ図形の値を表示
  for(vertex in graph2.getChildVertices(graph2.getDefaultParent())){
    println "value=${vertex.getValue()}"
  }
}
実行結果

関連情報
JGraphxのダウンロードページ