Итак, я понимаю принцип привязки при изменении размера объектов на панели по мере изменения ее размера, эта проблема немного отличается. Я запутался, я пытаюсь создать класс, который расширяет панель, которая создает в моей основной строке координаты startX и startY, привязанные к центру панели. Проблема в том, что при использовании getWidth()/2 или getHeight()/2 координата помещается где-то вверх и слева от начальных координат (0, 0), когда я нажимаю клавишу со стрелкой, которая при нажатии создает другую строку, которая рисуется в заданном направлении и начинается с конца последней нарисованной линии.
Как я уже сказал, когда я использую getWidth() / 2 и getHeight / 2 в качестве координат startX и startY моей новой строки, в ответ линия помещается в отрицательную координату, помещая ее за пределы экрана выше и слева от начальной (0, 0) координаты панели.
Ниже приведена часть моего кода, которая содержит конструктор по умолчанию, с которым у меня возникла проблема, в конструкторе не по умолчанию я даю возможность вручную вводить начальные координаты, и когда я это делаю, строка размещается именно там, где я хочу. .
public class LineDrawingObject extends Pane {
// ArrayList to store the Line Object's
ArrayList<Line> lines = new ArrayList<>();
Line line;
private Color lineColor;
private double lineLength;
private int lineCount = 0;
private double startX;
private double startY;
private double endX;
private double endY;
/** Default Constructor */
public LineDrawingObject() {
this.lineLength = 20;
line = new Line(this.getWidth() / 2, this.getHeight() / 2,
(this.getWidth() / 2), (this.getHeight() / 2) - this.lineLength);
this.lineColor = Color.BLACK;
line.setStroke(this.lineColor);
this.lineCount++;
this.lines.add(line);
getChildren().add(line);
}
Изменить: я подумал, что мне может понадобиться добавить дополнительную информацию
также я хотел добавить, что размер моей панели установлен в новой сцене (панель, 250, 250), поэтому координаты центра будут (125, 125).... Будет ли использование методов getWidth и getHeight на панели возвращать недопустимый размер если он еще не нарисован? Я попытался установить предпочтительный размер в моем методе запуска, но, похоже, это не сработало. Если это так, как я могу решить эту проблему?
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
/**
* Created by John on 7/24/2014.
*/
public class DrawLines extends Application {
@Override // Override the start method in the Application class
public void start(Stage primaryStage) {
// Create a pane
Pane pane = new Pane();
// Create object to draw lines upon KeyEvent
LineDrawingObject lineDrawingObject = new LineDrawingObject(20, Color.BLACK,
pane.getWidth() / 2, pane.getWidth() / 2);
pane.getChildren().add(lineDrawingObject);
lineDrawingObject.setOnKeyPressed(e -> {
lineDrawingObject.paintLine(e.getCode());
});
// Create a scene and place it in the pane
Scene scene = new Scene(pane, 250, 250);
primaryStage.setTitle("DrawLines"); // Set the stage title
primaryStage.setScene(scene); // Place the scene in the stage
primaryStage.show(); // Display the stage
// Allow object to receive key input
lineDrawingObject.requestFocus();
}
}
и вот объект LineDrawing:
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import java.util.ArrayList;
/** This object will draw lines inside of a Pane when an arrow key is
* pressed and will draw it in that direction from the current line */
public class LineDrawingObject extends Pane {
// ArrayList to store the Line Object's
ArrayList<Line> lines = new ArrayList<>();
Line line;
private Color lineColor;
private double lineLength;
private int lineCount = 0;
private double startX;
private double startY;
private double endX;
private double endY;
/** Default Constructor */
public LineDrawingObject() {
this.lineLength = 20;
line = new Line(this.getWidth() / 2, this.getHeight() / 2,
(this.getWidth() / 2), (this.getHeight() / 2) - this.lineLength);
this.lineColor = Color.BLACK;
line.setStroke(this.lineColor);
this.lineCount++;
this.lines.add(line);
getChildren().add(line);
}
/** Secondary Constructor, allows you to control the line length and color */
public LineDrawingObject(double lineLength, Color lineColor, double startX, double startY) {
this.lineLength = lineLength;
line = new Line(startX, startY,
startX, startY - this.lineLength);
this.lineColor = lineColor;
line.setStroke(this.lineColor);
this.lineCount++;
this.lines.add(line);
getChildren().add(line);
}
public ArrayList<Line> getLines() {
return lines;
}
public void setLines(ArrayList<Line> lines) {
this.lines = lines;
}
public Line getLine() {
return this.line;
}
public void setLine(Line line) {
this.line = line;
}
public Color getLineColor() {
return this.lineColor;
}
public void setLineColor(Color lineColor) {
this.lineColor = lineColor;
}
public double getLineLength() {
return this.lineLength;
}
public void setLineLength(double lineLength) {
this.lineLength = lineLength;
}
public int getLineCount() {
return this.lineCount;
}
public void setLineCount(int lineCount) {
this.lineCount = lineCount;
}
public double getStartX() {
return this.startX;
}
public void setStartX(double startX) {
this.startX = startX;
}
public double getStartY() {
return this.startY;
}
public void setStartY(double startY) {
this.startY = startY;
}
public double getEndX() {
return this.endX;
}
public void setEndX(double endX) {
this.endX = endX;
}
public double getEndY() {
return this.endY;
}
public void setEndY(double endY) {
this.endY = endY;
}
public void paintLine(KeyCode keyCode) {
// Set line start coordinates to the end of the last line
setStartX(line.getEndX());
setStartY(line.getEndY());
// Set line end coordinates
switch (keyCode) {
case UP: goUp(); break;
case LEFT: goLeft(); break;
case DOWN: goDown(); break;
case RIGHT: goRight(); break;
}
// Create line
line = new Line(getStartX(), getStartY(), getEndX(), getEndY());
line.setStroke(lineColor);
this.lines.add(line);
getChildren().add(line);
}
public void goLeft() {
setEndX(getStartX() - this.lineLength);
setEndY(getStartY());
}
public void goRight() {
setEndX(getStartX() + this.lineLength);
setEndY(getStartY());
}
public void goUp() {
setEndX(getStartX());
setEndY(getStartY() - this.lineLength);
}
public void goDown() {
setEndX(getStartX());
setEndY(getStartY() + this.lineLength);
}
}
Использование конструктора по умолчанию
Использование пользовательских координат