语言: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界面和组件。主要功能:
- 设置窗口标题为"圆和点关系判断",并且设置窗口关闭操作为退出应用程序。
- 使用流式布局(FlowLayout)来布局窗口中的组件。
- 初始化了标签、文本字段、按钮和文本区域等组件,并设置了它们的初始大小。
- 创建了滚动窗格(JScrollPane),并将文本区域添加到其中,以支持在文本区域中显示滚动条。
- 为“读取”按钮和“求解”按钮添加了事件监听器,这里使用了关键字this,暗示GUI类实现了ActionListener接口。
- 将所有组件添加到窗口中,并调用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界面上触发的动作。这段代码的具体作用是:
- 当用户点击“读取”按钮时,
e.getActionCommand().equals("读取")
条件为真,程序调用readFromFile()
方法,从文件中读取数据并显示在对应的文本字段中。 - 当用户点击“求解”按钮时,
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;
}
}
: