2009年11月27日金曜日

javafx で、スクロールパネル

--- 【追記】 ---

問題があった。
nodeにTileを渡したとして、Tileの中身を変えると画面が真っ白になる。
原因がまだわからない。

下のコードはバグ入りです。
原因わかったら、修正しようと思います。

---【追記ここまで】------------


スクロールパネルで悩むのは、これで最後にしたいよ。
ScrollBar と、ClipView を組み合わせて作ってみた。

node に、スクロールさせたいNodeを入れる。
width,height に、スクロールで見れるパネルの大きさを指定。
下のコードだと、縦にしかスクロールバーが出ないけど、とりあえず置いときます。

後でコードの直しとかやったら、またコードを上げます。


import javafx.scene.CustomNode;
import javafx.scene.Node;
import javafx.scene.control.ScrollBar;
import javafx.scene.layout.ClipView;
import javafx.scene.layout.LayoutInfo;
import javafx.scene.layout.HBox;

public class ScrollPane extends CustomNode{
 public var node : Node;
 public-init var height : Number;
 public-init var width : Number;
 
 var vertical : Boolean = true;

 def SCROLL_BAR_MIN = 1;
 def NOT_SCROLL = -1;

 var scrollBarValue : Number = SCROLL_BAR_MIN on replace{
  node.layoutY = -scrollBarValue;
 };
 def scrollBar : ScrollBar = ScrollBar {
  min: SCROLL_BAR_MIN
  max: bind if( node.boundsInLocal.height <= height ) NOT_SCROLL else node.boundsInLocal.height - height
  vertical : vertical
  value: bind scrollBarValue with inverse
  layoutInfo: LayoutInfo{ height: height }
 }

 var clipView : ClipView = ClipView{
  pannable: false
  node: bind node
  layoutInfo: LayoutInfo{
   width: width - scrollBar.width
   height: height
  }
 }

 public override function create() : Node{
  return HBox{ content:[ clipView, scrollBar ] };
 }
}