[英]Draw points defined in file in Java
我正在尝试学习Java的某些图形方面。 我制作了一个列出这些点的文本文件,文件的第一行确定了多少点。 我需要将点放在文本文件中并将其绘制在画布上。 我看过几种资源,但我只是不明白所有事情如何协同工作。 我什至找不到一个提供所有代码并解释每个部分的位置以及如何调用它的教程。 基本上,我对JPanels,JFrames和整个过程感到困惑。 以下是我到目前为止编写的代码以及该文件的外观的屏幕快照。
码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.Graphics.*;
import java.util.*;
import java.io.*;
public class drawPoints extends JPanel
{
public void paintComponent(Graphics g)
{
super.paintComponent(g);
this.setBackground(Color.WHITE);
g.setColor(Color.BLUE);
try{
FileInputStream fstream = new FileInputStream("Desktop/Assign2Test1.txt");
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
int i = 1;
while ((strLine = br.readLine()) != null){
final Point[] points = new Point[Integer.parseInt(br.readLine())];
final String[] split = strLine.split("\u0009");
points[i++] = new Point(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
}
in.close();
}catch (Exception e){ System.err.println("Error: " + e.getMessage());
}
}
import javax.swing.*;
public class mainDrawPoint
{
public static void main(String args[])
{
JFrame f = new JFrame("Draw Points Application");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
drawPoints dP = new drawPoints();
f.add(dP);
f.setSize(500,500);
f.setVisible(true);
}
}
代码要做的就是将值放入数组中。
x和y坐标由制表符分隔。 任何帮助,将不胜感激!
您应该考虑以下内容:
据我所知,第一个数字是计数。 如果确实如此,则不需要Strings的LinkedList。 构建一个Point数组,例如:
final Point[] points = new Point[Integer.parseInt(br.readLine())];
从那里开始,使用具有strLine变量的循环系统,使用该String并计算出如何解析它,例如:
int i = 0; // Put this outside of the while loop.
//While loop condition check here
final String[] split = strLine.split("\u0009"); // Unicode character for tab.
points[i++] = new Point(Integer.parseInt(split[0]), Integer.parseInt(split[1])); // Assuming length 2 of split.
至于渲染点,请创建一个新类,该类扩展了JPanel。 在该类中,添加以下代码并填写TODO:
@Override
public void paintComponent(final Graphics g){
//TODO: Paint what you want here, automatically double-buffered
}
现在,当您创建一个新的Panel类并将其添加到JFrame时,每当您从JFrame调用repaint()时,它将在Panel类的paintComponent()方法中呈现代码。 如果您还有其他疑问,请随时提问。
编辑:示例代码:
import javax.swing.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Test {
private static final String FILE = "Desktop/Assign2Test1.txt";
private static Point[] points;
public static void main(final String[] args){
try{
final BufferedReader br = new BufferedReader(new FileReader(new File(FILE)));
points = new Point[Integer.parseInt(br.readLine())];
int i = 0;
int xMax = 0;
int yMax = 0;
while(br.ready()){
final String[] split = br.readLine().split("\u0009");
final int x = Integer.parseInt(split[0]);
final int y = Integer.parseInt(split[1]);
xMax = Math.max(x, xMax);
yMax = Math.max(y, yMax);
points[i++] = new Point(x, y);
}
final JFrame frame = new JFrame("Point Data Rendering");
final Panel panel = new Panel();
panel.setPreferredSize(new Dimension(xMax + 10, yMax + 10));
frame.setContentPane(panel);
frame.pack();
frame.setVisible(true);
frame.repaint();
} catch (final Exception e){
e.printStackTrace();
}
}
public static class Panel extends JPanel {
@Override
public void paintComponent(final Graphics g){
g.setColor(Color.RED);
for(final Point p : points){
g.fillRect((int) p.getX(), (int) p.getY(), 2, 2);
}
}
}
}
使用panel.getGraphics()
方法从元素中获取Graphics对象的实例。 稍后使用graphics对象使用graphics.drawLine()
方法绘制线条。
您可以使用正则表达式string.split("\\t")
分割行的内容。 这将为您提供一个包含2个元素的数组(因为您说每行包含2个数字,并且它们之间使用制表符)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.