JavaFX程序添加点后无显示问题排查求助
JavaFX极大值点连线程序无显示问题排查
我开发了一款JavaFX程序,功能是向数组中录入点,并在极大值点之间绘制连线;左键点击可添加点并重新计算极大值点,右键点击可移除点。目前遇到的问题是:读取文件中的点或手动添加点后,界面均无任何显示,尝试多种方法仍无法解决,恳请帮忙排查。
相关效果截图:
- 文本文件中的点:

- 预期初始运行效果:

- 实际运行效果:

- 修正鼠标事件后的效果:

Point.java
package application; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public final class Point implements Comparable<Point> { private final double x; private final double y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public double getY() { return y; } public boolean isBelowAndLeftOf(Point other) { return this.x <= other.getX() && this.y <= other.getY(); } @Override public int compareTo(Point other) { return Double.compare(this.x, other.getX()); } }
MaximalPointsPane.java
package application; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Pane; import javafx.scene.shape.Line; import javafx.scene.input.MouseButton; import java.util.Collections; import java.util.ArrayList; public class MaximalPointsPane extends Pane { private final ArrayList<Point> points; private final ArrayList<Point> maximalPoints; public MaximalPointsPane(ArrayList<Point> points) { this.points = points; this.maximalPoints = new ArrayList<>(); findMaximalPoints(); drawMaximalLines(); this.setOnMouseClicked(this::handleMouseClick); } private void findMaximalPoints() { maximalPoints.clear(); for (Point p1 : points) { boolean isMaximal = true; for (Point p2 : points) { if (p1!= p2 && p2.isBelowAndLeftOf(p1)) { isMaximal = false; break; } } if (isMaximal) { maximalPoints.add(p1); } } } private void drawMaximalLines() { getChildren().clear(); for (int i = 0; i < maximalPoints.size() - 1; i++) { Point p1 = maximalPoints.get(i); Point p2 = maximalPoints.get(i + 1); Line line = new Line(p1.getX(), p1.getY(), p2.getX(), p2.getY()); getChildren().add(line); } } private void handleMouseClick(MouseEvent event) { if (event.isPrimaryButtonDown()) { // Left click double x = event.getX(); double y = event.getY(); points.add(new Point(x, y)); findMaximalPoints(); drawMaximalLines(); } else if (event.isSecondaryButtonDown()) { // Right click double x = event.getX(); double y = event.getY(); Point pointToRemove = null; for (Point p : points) { if (Math.abs(p.getX() - x) < 5 && Math.abs(p.getY() - y) < 5) { pointToRemove = p; break; } } if (pointToRemove!= null) { points.remove(pointToRemove); findMaximalPoints(); drawMaximalLines(); } } } }
Main.java
package application; import javafx.application.Application; import javafx.scene.Scene; import javafx.stage.Stage; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { ArrayList<Point> points = new ArrayList<>(); try { File file = new File("points.txt"); Scanner scanner = new Scanner(file); while (scanner.hasNext()) { double x = scanner.nextDouble(); double y = scanner.nextDouble(); points.add(new Point(x, y)); } scanner.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } MaximalPointsPane pane = new MaximalPointsPane(points); Scene scene = new Scene(pane, 500, 500); stage.setTitle("Maximal Points"); stage.setScene(scene); stage.show(); } }
内容的提问来源于stack exchange,提问作者dscal2007
相关产品推荐
相关产品推荐

