自分もやってみましたがうまくいきませんでした。
SceneはデフォルトでSceneAntialiasing.DISABLEDになっているはずですのでこれに影響されているわけではないはずです。(一応明示的に指定してみましたが、結果はかわらずでした)
GraphicsContextのリファレンスで関連しそうなものを見てみましたがペンの境界を表現するようなものは見当たりません。Strokeならば線分の属性が指定できますがfillRectなどの場合は境界について制御するようなものはない気がします。
推測ですがこれはJavaFXの座標系がintではなくdoubleを基本としているという事実に関係しているのではないかと思えました。つまりシーン上に描画した内容がデバイスピクセル上にどのように反映させるかについては「少なくともNodeのスケールプロパティーを用いた拡大縮小についてはJavaFXが適当にスムーズにレンダリングするのでプログラマーは気にしないでほしい」ということではないかと。
この推測を肯定 or 否定できる情報を見つけることはできませんでした。間違っている可能性もあるかと思います。
代案:
それはさておき、もしスケールプロパティーでくっきりとした描画ができのなら代案がほしいところですね。それは次のようにすると一応できました。
- NodeのscaneX, scaleYプロパティーは用いない
- GraphicsContextのtransformのscaleを用いる
拡大縮小の度にcanvasへの描画しなおしが必要な点が若干面倒ですね。ただ、描画の際にはGraphicsContext#save/restoreを用いてやると割合単純に書けます。
java
1void redraw(Canvas canvas, double scale) {
2 GraphicsContext gc = canvas.getGraphicsContext2D();
3 gc.clearRect(0, 0, canvas.getWidth(), canvas.getHeight());
4 gc.save(); // 変換座標他を内部スタックへ退避
5 gc.scale(scale, scale);
6 try {
7 //ここでgcへ描画する。もちろんスケールの違いは意識せずに描画する。
8 gc.setColor(Color.BLUE);
9 gc.fillRect(0, 0, 20, 20);
10 ...
11 } finally {
12 gc.restore(); // 変換座標他を内部スタックから回復
13 }
14}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/19 14:19