使用JAVA和GUI进行圆和点的关系判断(简单)

语言:Java
使用类和对象来封装点和圆的数据和行为。
创建 Point 类表示点,Circle 类表示圆。
GUI:实现界面人机交互操作。
文件操作:文件中读取数据和向文件写入数据。

实现的功能
数据读取:从文件中读取圆的圆心坐标、半径以及点的坐标,并在界面上显示这些数据。
数据输入:允许用户在界面上手动输入新的圆和点的数据。
关系判断:根据读取或输入的数据,计算并判断点是否位于圆内。
结果显示:在文本框中显示点和圆的关系。
结果保存:将计算结果附加写入到用户选定的文件中。
用户界面交互:提供友好的图形用户界面。

创建一个继承自JFrame的GUI类,并且实现了ActionListener接口

class GUI extends JFrame implements ActionListener{
}

声明私有的文本字段(JTextField)和文本区域(JTextArea)的实例变量,且只能被赋值一次

    private final JTextField circleXField;
    private final JTextField circleYField;
    private final JTextField radiusField;
    private final JTextField pointXField;
    private final JTextField pointYField;
    private final JTextArea resultArea;

GUI类的构造函数,用于初始化GUI界面和组件。主要功能:

  1. 设置窗口标题为"圆和点关系判断",并且设置窗口关闭操作为退出应用程序。
  2. 使用流式布局(FlowLayout)来布局窗口中的组件。
  3. 初始化了标签、文本字段、按钮和文本区域等组件,并设置了它们的初始大小。
  4. 创建了滚动窗格(JScrollPane),并将文本区域添加到其中,以支持在文本区域中显示滚动条。
  5. 为“读取”按钮和“求解”按钮添加了事件监听器,这里使用了关键字this,暗示GUI类实现了ActionListener接口。
  6. 将所有组件添加到窗口中,并调用pack()方法对窗口进行布局,并最终设置窗口可见。
public GUI() {
        setTitle("圆和点关系判断");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        // 初始化组件
        JLabel circleLabel = new JLabel("圆心坐标:");
        circleXField = new JTextField(5);
        circleYField = new JTextField(5);
        JLabel radiusLabel = new JLabel("半径:");
        radiusField = new JTextField(5);

        JLabel pointLabel = new JLabel("点坐标:");
        pointXField = new JTextField(5);
        pointYField = new JTextField(5);

        JButton readButton = new JButton("读取");
        JButton solveButton = new JButton("求解");

        resultArea = new JTextArea(10, 20);
        resultArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(resultArea);

        // 添加事件监听器
        readButton.addActionListener(this);
        solveButton.addActionListener(this);

        // 将组件添加到窗口
        add(circleLabel);
        add(circleXField);
        add(circleYField);
        add(radiusLabel);
        add(radiusField);

        add(pointLabel);
        add(pointXField);
        add(pointYField);

        add(readButton);
        add(solveButton);
        add(scrollPane);

        pack();
        setVisible(true);
    }

代码实现了actionPerformed方法,是一个事件处理器,用于响应用户在GUI界面上触发的动作。这段代码的具体作用是:

  1. 当用户点击“读取”按钮时,e.getActionCommand().equals("读取")条件为真,程序调用readFromFile()方法,从文件中读取数据并显示在对应的文本字段中。
  2. 当用户点击“求解”按钮时,e.getActionCommand().equals("求解")条件为真,程序调用solveAndWriteToFile()方法,进行计算并将结果写入到文件中。
 @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("读取")) {
            readFromFile();
        } else if (e.getActionCommand().equals("求解")) {
            solveAndWriteToFile();
        }
    }

私有方法readFromFile,作用是从文件中读取数据并将数据填充到相应的文本字段中。代码首先尝试打开文件,然后逐行读取文件内容,并使用正则表达式来提取数据。提取到的数据包括点的坐标和圆的信息(圆心坐标及半径)。然后,将提取到的数据设置到相应的文本字段中,并在控制台打印提取到的数据。如果无法从行中提取数据,或者出现格式错误或不匹配的情况,会在控制台输出错误信息。在处理过程中,代码还考虑了可能出现的IO异常和数字格式异常,并进行了相应的处理。(记得将文件目录改成自己创建的文件的目录)

private void readFromFile() {
        try {
            File file = new File("C:\\(你自己的完整文件目录).txt");
            BufferedReader reader = new BufferedReader(new FileReader(file));

            String line;
            while ((line = reader.readLine()) != null) {
                // 用正则表达式提取数据
                Pattern pattern = Pattern.compile("点\\(([^,]+),([^)]+)\\)和圆\\(([^,]+),([^,]+),([^)]+)\\)");
                Matcher matcher = pattern.matcher(line);

                if (matcher.find()) {
                    // 提取数据
                    double pointX = Double.parseDouble(matcher.group(1).trim());
                    double pointY = Double.parseDouble(matcher.group(2).trim());
                    double circleX = Double.parseDouble(matcher.group(3).trim());
                    double circleY = Double.parseDouble(matcher.group(4).trim());
                    double radius = Double.parseDouble(matcher.group(5).trim());

                    // 将数据设置到相应的字段中
                    pointXField.setText(String.valueOf(pointX));
                    pointYField.setText(String.valueOf(pointY));
                    circleXField.setText(String.valueOf(circleX));
                    circleYField.setText(String.valueOf(circleY));
                    radiusField.setText(String.valueOf(radius));

                    // 打印提取的数据
                    System.out.println("Point: (" + pointX + ", " + pointY + ")");
                    System.out.println("Circle center: (" + circleX + ", " + circleY + "), Radius: " + radius);
                } else {
                    // 处理格式错误或不匹配的情况
                    System.err.println("无法从行中提取数据:" + line);
                }
            }

            reader.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (NumberFormatException ex) {
            // 处理数字格式异常
            ex.printStackTrace();
        }
    }

私有方法 solveAndWriteToFile(),作用是将点和圆的关系写入到GUI界面上的结果区域中,并将结果以特定格式写入到文件中。在处理过程中,代码使用了异常处理机制来捕获可能出现的IO异常,并在发生异常时打印异常堆栈信息。

private void solveAndWriteToFile() {
        try {
            double circleX = Double.parseDouble(circleXField.getText());
            double circleY = Double.parseDouble(circleYField.getText());
            double radius = Double.parseDouble(radiusField.getText());
            Circle circle = new Circle(circleX, circleY, radius);

            double pointX = Double.parseDouble(pointXField.getText());
            double pointY = Double.parseDouble(pointYField.getText());
            Point point = new Point(pointX, pointY);

            String relation = circle.getRelation(point);
            resultArea.append("点和圆的关系:" + relation + "\n");

            BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\(你自己的完整文件目录).txt", true));
            writer.write("点(" + pointX + "," + pointY + ")和圆(" + circleX + "," + circleY + "," + radius + ")的关系:" + relation);
            writer.newLine();
            writer.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

方法 getRelation(Point point),用于判断给定的点与圆之间的关系。通过计算点与圆心之间的距离,并将其与圆的半径进行比较,该方法可以判断点是位于圆内、圆上还是圆外。

// 判断点和圆的关系
    public String getRelation(Point point) {
        double distance = Math.sqrt(Math.pow((point.getX() - centerX), 2) + Math.pow((point.getY() - centerY), 2));

        if (distance < radius) {
            return "点在圆内";
        } else if (distance == radius) {
            return "点在圆上";
        } else {
            return "点在圆外";
        }
    }

读取文件数据

根据输入求解

                                                           文件保存 

完整代码

GUI  MAIN:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class GUI extends JFrame implements ActionListener {
    private final JTextField circleXField;
    private final JTextField circleYField;
    private final JTextField radiusField;
    private final JTextField pointXField;
    private final JTextField pointYField;
    private final JTextArea resultArea;


    public GUI() {
        setTitle("圆和点关系判断");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        // 初始化组件
        JLabel circleLabel = new JLabel("圆心坐标:");
        circleXField = new JTextField(5);
        circleYField = new JTextField(5);
        JLabel radiusLabel = new JLabel("半径:");
        radiusField = new JTextField(5);

        JLabel pointLabel = new JLabel("点坐标:");
        pointXField = new JTextField(5);
        pointYField = new JTextField(5);

        JButton readButton = new JButton("读取");
        JButton solveButton = new JButton("求解");

        resultArea = new JTextArea(10, 20);
        resultArea.setEditable(false);
        JScrollPane scrollPane = new JScrollPane(resultArea);

        // 添加事件监听器
        readButton.addActionListener(this);
        solveButton.addActionListener(this);

        // 将组件添加到窗口
        add(circleLabel);
        add(circleXField);
        add(circleYField);
        add(radiusLabel);
        add(radiusField);

        add(pointLabel);
        add(pointXField);
        add(pointYField);

        add(readButton);
        add(solveButton);
        add(scrollPane);

        pack();
        setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("读取")) {
            readFromFile();
        } else if (e.getActionCommand().equals("求解")) {
            solveAndWriteToFile();
        }
    }

    private void readFromFile() {
        try {
            File file = new File("C:\\Users\\YF\\Desktop\\面向对象实验\\finalExam.txt");
            BufferedReader reader = new BufferedReader(new FileReader(file));

            String line;
            while ((line = reader.readLine()) != null) {
                // 用正则表达式提取数据
                Pattern pattern = Pattern.compile("点\\(([^,]+),([^)]+)\\)和圆\\(([^,]+),([^,]+),([^)]+)\\)");
                Matcher matcher = pattern.matcher(line);

                if (matcher.find()) {
                    // 提取数据
                    double pointX = Double.parseDouble(matcher.group(1).trim());
                    double pointY = Double.parseDouble(matcher.group(2).trim());
                    double circleX = Double.parseDouble(matcher.group(3).trim());
                    double circleY = Double.parseDouble(matcher.group(4).trim());
                    double radius = Double.parseDouble(matcher.group(5).trim());

                    // 将数据设置到相应的字段中
                    pointXField.setText(String.valueOf(pointX));
                    pointYField.setText(String.valueOf(pointY));
                    circleXField.setText(String.valueOf(circleX));
                    circleYField.setText(String.valueOf(circleY));
                    radiusField.setText(String.valueOf(radius));

                    // 打印提取的数据
                    System.out.println("Point: (" + pointX + ", " + pointY + ")");
                    System.out.println("Circle center: (" + circleX + ", " + circleY + "), Radius: " + radius);
                } else {
                    // 处理格式错误或不匹配的情况
                    System.err.println("无法从行中提取数据:" + line);
                }
            }

            reader.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (NumberFormatException ex) {
            // 处理数字格式异常
            ex.printStackTrace();
        }
    }

    private void solveAndWriteToFile() {
        try {
            double circleX = Double.parseDouble(circleXField.getText());
            double circleY = Double.parseDouble(circleYField.getText());
            double radius = Double.parseDouble(radiusField.getText());
            Circle circle = new Circle(circleX, circleY, radius);

            double pointX = Double.parseDouble(pointXField.getText());
            double pointY = Double.parseDouble(pointYField.getText());
            Point point = new Point(pointX, pointY);

            String relation = circle.getRelation(point);
            resultArea.append("点和圆的关系:" + relation + "\n");

            BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Users\\YF\\Desktop\\面向对象实验\\finalExam.txt", true));
            writer.write("点(" + pointX + "," + pointY + ")和圆(" + circleX + "," + circleY + "," + radius + ")的关系:" + relation);
            writer.newLine();
            writer.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}


public class Main {
    public static void main(String[] args) {
        new GUI();
    }
}

Circle类:

public class Circle {
    private final double centerX;
    private final double centerY;
    private final double radius;

    public Circle(double centerX, double centerY, double radius) {
        this.centerX = centerX;
        this.centerY = centerY;
        this.radius = radius;
    }

    // 判断点和圆的关系
    public String getRelation(Point point) {
        double distance = Math.sqrt(Math.pow((point.getX() - centerX), 2) + Math.pow((point.getY() - centerY), 2));

        if (distance < radius) {
            return "点在圆内";
        } else if (distance == radius) {
            return "点在圆上";
        } else {
            return "点在圆外";
        }
    }
}

 Point类:

public class Point {
    private double x;
    private double y;

    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double getX() {
        return x;
    }

    public double getY() {
        return y;
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值