Как нарисовать хрустящую, непрозрачную линию волос в JavaFX 2.2?

Каков наилучший способ сделать четкую, непрозрачную линию волос в JavaFX 2.2?

В документации говорится, что с помощью strokeWidth 0.0d это будет 0.0d волос, но это просто не видно вообще. Значения > 0.0d and <1.0d показывают строки, которые очень хороши, но также не показывают непрозрачного поведения. Когда одна линия обрезает другую, точки пересечения легче, чем остальная часть строки (я ожидал бы этого поведения от линии с некоторой прозрачностью). Наконец, 1.0d рисует белую линию с шириной нескольких пикселей.

Это мой тестовый код:

 LineBuilder.create().startX(i*gridSize).startY(0).endX(i*gridSize).endY(height).smooth(false).stroke(Color.WHITE).strokeWidth(0.5d).fill(Color.WHITE).build(); 

Вы можете использовать подclass Region , например панель для своего родителя, с привязкой snapToPixel к true.

Кроме того, обратитесь к документации по узлу в системе координат.

На уровне пикселя устройства целые координаты отображаются на углы, а трещины между пикселями и центрами пикселей появляются в середине точки между целыми пиксельными местоположениями. Поскольку все значения координат указаны с номерами с плавающей запятой, координаты могут точно указывать на эти углы (когда значения с плавающей точкой имеют точные целочисленные значения) или в любом месте на пикселе. Например, координата (0,5, 0,5) будет указывать на центр верхнего левого пикселя на сцене. Аналогично, прямоугольник в точке (0, 0) с размерами 10 на 10 будет располагаться от верхнего левого угла верхнего левого пикселя на этапе до нижнего правого угла 10-го пикселя на 10-й линии сканирования. Центр пикселей последнего пикселя внутри этого прямоугольника будет находиться в координатах (9.5, 9.5).

Также см. Документацию Shape :

Большинство узлов имеют тенденцию иметь только целые переводы, применяемые к ним, и нередко они определяются с использованием целочисленных координат. Для этого общего случая заливки форм с прямыми линиями имеют тенденцию быть четкими, поскольку они выстраиваются в линию с трещинами между пикселями, которые попадают на координаты целочисленного устройства и, следовательно, имеют тенденцию естественно покрывать целые пиксели. С другой стороны, поглаживание этих же фигур часто может приводить к нечетким контурам, поскольку атрибуты поглаживания по умолчанию указывают, что ширина штриха по умолчанию равна 1,0 координатам, которая часто соответствует точно одному пикселю устройства, а также, что штрих должен оседлать границу формы , падая на половину по обе стороны границы. Поскольку границы во многих общих формах имеют тенденцию падать непосредственно на целочисленные координаты, и эти целые координаты часто точно сопоставляются с целыми местоположениями устройств, границы, как правило, приводят к 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(); } } 

Пример типа линии

  • Обновление пользовательского интерфейса из разных streamов в JavaFX
  • JavaFX передает значения от дочернего к родительскому
  • Создание кнопки JavaFX 2 с использованием только FXML - Как добавить изображение к кнопке?
  • Копируемый ярлык / TextField / LabeledText в JavaFX
  • JavaFX: Как получить этап от controllerа во время инициализации?
  • Автоматическая ширина столбца JavaFX 2
  • Проблемы с совместимостью javafx 8 - статические поля FXML
  • JavaFX открыть новое окно
  • Как подключить источник или JavaDoc в eclipse для любого файла jar, например JavaFX?
  • Как получить номер версии JavaFX?
  • Автозаполнение ComboBox в JavaFX
  • Давайте будем гением компьютера.