在Java中绘制文件中定义的点

在Java中绘制文件中定义的点,java,swing,graphics,drawing,jpanel,Java,Swing,Graphics,Drawing,Jpanel,我正在努力学习Java的一些图形方面的知识。我制作了一个文本文件,列出了点,文件中的第一行决定了有多少点。我需要获取文本文件中的点,并将它们绘制在画布上。我查看了一些资源,但我不明白所有资源是如何协同工作的。我甚至找不到一个能给出所有代码并解释每个部分的位置和调用方式的教程。基本上,我被JPanels、JFrames和整个过程弄糊涂了。下面是到目前为止我编写的代码和该文件的屏幕截图 代码: 代码所做的就是将值放入数组中 x和y坐标由选项卡分隔。任何帮助都将不胜感激 使用panel.getGra

我正在努力学习Java的一些图形方面的知识。我制作了一个文本文件,列出了点,文件中的第一行决定了有多少点。我需要获取文本文件中的点,并将它们绘制在画布上。我查看了一些资源,但我不明白所有资源是如何协同工作的。我甚至找不到一个能给出所有代码并解释每个部分的位置和调用方式的教程。基本上,我被JPanels、JFrames和整个过程弄糊涂了。下面是到目前为止我编写的代码和该文件的屏幕截图

代码:

代码所做的就是将值放入数组中


x和y坐标由选项卡分隔。任何帮助都将不胜感激

使用
panel.getGraphics()
方法从元素中获取图形对象的实例。稍后使用图形对象使用
graphics.drawLine()
绘制线条


可以使用正则表达式
字符串拆分行的内容。拆分(“\t”)
。这将给你一个有2个元素的数组(因为你说每行包含2个数字,中间有一个制表符)。

你应该考虑的是:

据我所知,第一个数字是计数。如果确实如此,那么字符串不需要LinkedList。构建点阵列,例如:

final Point[] points = new Point[Integer.parseInt(br.readLine())];
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.
从这里开始,使用strLine变量的循环系统,使用该字符串并了解如何解析它,例如:

final Point[] points = new Point[Integer.parseInt(br.readLine())];
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);
            }
        }

    }

}

你的问题是什么?你想完成什么?您说过您正在尝试在画布上绘制点,虽然这段代码似乎成功地读取了文件,但我在代码中没有看到任何关于使用画布的内容。如果你想要一个完整的教程,那真的不是它的目的。首先,我会看一看,然后再看一看。我也会避免使用AWT组件,并坚持使用Swing API。我只需要知道如何使用JPanel来绘制点。请不要使用DataInputStream来读取文本,所以我有以下内容:公共静态类drawPoints扩展JPanel{@Override public void paintComponent(final Graphics g){g.setColor(Color.RED);例如(最终点p:points){g.fillRect((int)p.getX(),(int)p.getY(),2,2);}}}}}}并且它说:drawPoints.java:9:这里和for上不允许修改器static(最终点p:points)它说:drawPoints.java:14:找不到符号-这指向小写的p。这真的很难读…如果你想让我把它放到问题中,我可以。对此很抱歉。确保java.awt.Point被导入。另外,该类应该是静态的,如果它是我如何做的,作为一个子类。好的,我解决了这些问题…现在我开始g:at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48),它位于以下行:final int x=Integer.parseInt(split[0]);final int y=Integer.parseInt(split[1]);