0

私は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 座標はタブで区切られています。どんな助けでも大歓迎です!

4

2 に答える 2

1

考慮すべきことは次のとおりです。

私が知る限り、最初の数字はカウントです。それが本当にそれである場合、文字列の LinkedList は必要ありません。Point 配列を作成します。次に例を示します。

final Point[] points = new Point[Integer.parseInt(br.readLine())];

そこから、strLine 変数で使用しているループ システムを使用して、その文字列を使用し、それを解析する方法を考え出します。次に例を示します。

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);
            }
        }

    }

}
于 2013-01-28T04:47:58.637 に答える
0

panel.getGraphics()メソッドを使用して、要素からGraphicsオブジェクトのインスタンスを取得します。graphics.drawLine() 後でグラフィックスオブジェクトを使用して、メソッドを使用して線を描画します。

正規表現を使用して行の内容を分割できますstring.split("\t")。これにより、2つの要素を持つ配列が得られます(各行にタブを挟んだ2つの数値が含まれていると言うため)。

于 2013-01-28T04:35:06.210 に答える