可以使用Region子類,如Pane爲你的父母,擁有snapToPixel設置爲true。
此外,請參閱座標系統上的Node文件。
在設備像素級,整數座標映射到像素和像素的中心之間的角部 和裂縫出現在 整數像素位置之間的中點。因爲所有座標值都是用浮點數指定的,所以座標可以精確地指向這些角(當浮點值具有精確的整數值時)或者指向像素上的任何位置。例如,(0.5,0.5)的座標將指向舞臺上左上角的 像素的中心。類似地,具有10乘10的尺寸 的(0,0)的矩形將從舞臺上的左上角 像素跨越到第10掃描線上的第10像素的右下角。 矩形內最後一個像素的像素中心位於座標(9.5,9.5)處。
另見Shape文檔:
大多數節點往往適用於他們僅整數翻譯和 他們往往使用整數座標來定義,以及有。對於 這種常見情況,用直線邊緣填充形狀往往是脆弱的,因爲它們與整數器件座標上的像素之間的裂縫對齊,因此傾向於自然覆蓋整個像素。另一方面,撫摸那些相同的形狀可能經常導致模糊輪廓,因爲默認描邊屬性指定 默認筆觸寬度是1.0座標,其通常映射到 恰好1個設備像素並且筆劃應橫跨 跨越 形狀的邊界,在邊界的任一側落下一半。由於 許多常見形狀的邊界傾向於直接落在整數 座標上,並且這些整數座標通常精確映射到整數設備位置,所以邊界傾向於導致覆蓋整個設備位置上的像素行和列的50%覆蓋範圍 一個邊框的形狀,而不是100%覆蓋在一個或另一個。因此,填充可能通常很脆,但筆畫通常是模糊不清的。
兩種常見的解決方案,以避免這些模糊輪廓是使用較寬的 筆畫完全覆蓋多個像素 - 通常筆劃寬度的2.0 如果在效果無刻度變換將實現這一點 - 或指定任一StrokeType .INSIDE或StrokeType.OUTSIDE 衝程樣式 - 這將偏置缺省單個單元衝程到全像素行或列只是內部或所述形狀的 邊界外的 之一。
因此,如果您將節點留在沒有snapToPixel的組或區域中,則可以按照Shape文檔中的上述說明進行操作。
下面是一些示例代碼:
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.LineBuilder;
import javafx.scene.shape.StrokeType;
import javafx.scene.text.Text;
import javafx.stage.Stage;
/** http://stackoverflow.com/questions/11886230/how-to-draw-a-crisp-opaque-hairline-in-javafx-2-2 */
public class LineWidths extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
Line fuzzyline = LineBuilder.create()
.startX(5).startY(50)
.endX(90).endY(50)
.stroke(Color.BLACK).strokeWidth(1)
.build();
Line hairline = LineBuilder.create()
.startX(4.5).startY(99.5)
.endX(89.5).endY(99.5)
.stroke(Color.BLACK).strokeWidth(1)
.build();
Line fatline = LineBuilder.create()
.startX(5).startY(150)
.endX(90).endY(150)
.stroke(Color.BLACK).strokeWidth(1).strokeType(StrokeType.OUTSIDE)
.build();
Pane snappedPane = new Pane();
Line insideline = LineBuilder.create()
.startX(5).startY(25)
.endX(90).endY(25)
.stroke(Color.BLACK).strokeWidth(1)
.build();
snappedPane.setSnapToPixel(true);
snappedPane.getChildren().add(insideline);
snappedPane.setPrefSize(100, 50);
snappedPane.relocate(-0.5, 174.5);
stage.setScene(
new Scene(
new Group(
fuzzyline, hairline, fatline, snappedPane,
new Text(10, 40, "fuzzyline"),
new Text(10, 90, "hairline"),
new Text(10, 140, "fatline"),
new Text(10, 190, "snappedPane")
), 100, 250
)
);
stage.show();
}
}
另見相關的問題:什麼是JavaFX中2線的確切尺寸(http://stackoverflow.com/questions/ 11881834 /什麼-是-A線-精確維度合JavaFX的2) – jewelsea 2012-08-10 18:37:12