You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:02:35