2015-06-20 35 views
1

学习循环,数组,方法......后,我开始玩图形,但遇到了一些问题。当我看到这个例子时,我正在寻找一些示例:http://javaceda.blogspot.ch/2010/06/draw-cartesian-coordinate-system-in.htmlJava中的笛卡尔平面

它提供了Java中笛卡尔平面的示例。我几乎可以理解该代码的所有内容(除了像invokelater,SwingUtilities这几行以外,我稍后会看看它们。)。

假设现在我想用构造函数,getters,将点的笛卡尔坐标转换为“像素坐标”的方法以及在平面上打印点的方法来创建类“Point”。

所以,这里是从链路所采取的代码:

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Cartesian { 
public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
    CartesianFrame frame = new CartesianFrame(); 
    frame.showUI(); 
    } 
    }); 
} 

} 

class CartesianFrame extends JFrame { 
CartesianPanel panel; 

public CartesianFrame() { 
    panel = new CartesianPanel(); 
    add(panel); 
} 

public void showUI() { 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setTitle("Cartesian"); 
    setSize(700, 700); 
    setVisible(true); 
} 
} 

class CartesianPanel extends JPanel { 
// x-axis coord constants 
public static final int X_AXIS_FIRST_X_COORD = 50; 
public static final int X_AXIS_SECOND_X_COORD = 600; 
public static final int X_AXIS_Y_COORD = 600; 

// y-axis coord constants 
public static final int Y_AXIS_FIRST_Y_COORD = 50; 
public static final int Y_AXIS_SECOND_Y_COORD = 600; 
public static final int Y_AXIS_X_COORD = 50; 

//arrows of axis are represented with "hipotenuse" of 
//triangle 
// now we are define length of cathetas of that triangle 
public static final int FIRST_LENGHT = 10; 
public static final int SECOND_LENGHT = 5; 

// size of start coordinate lenght 
public static final int ORIGIN_COORDINATE_LENGHT = 6; 

// distance of coordinate strings from axis 
public static final int AXIS_STRING_DISTANCE = 20; 


public void paintComponent(Graphics g) { 

    super.paintComponent(g); 

    Graphics2D g2 = (Graphics2D) g; 

    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON); 

    // x-axis 
    g2.drawLine(X_AXIS_FIRST_X_COORD, X_AXIS_Y_COORD, 
    X_AXIS_SECOND_X_COORD, X_AXIS_Y_COORD); 
    // y-axis 
    g2.drawLine(Y_AXIS_X_COORD, Y_AXIS_FIRST_Y_COORD, 
    Y_AXIS_X_COORD, Y_AXIS_SECOND_Y_COORD); 

    // draw origin Point 
    g2.fillOval(
    X_AXIS_FIRST_X_COORD - (ORIGIN_COORDINATE_LENGHT/2), 
    Y_AXIS_SECOND_Y_COORD - (ORIGIN_COORDINATE_LENGHT/2), 
    ORIGIN_COORDINATE_LENGHT, ORIGIN_COORDINATE_LENGHT); 

    // numerate axis 
    int xCoordNumbers = 10; 
    int yCoordNumbers = 10; 
    int xLength = (X_AXIS_SECOND_X_COORD - X_AXIS_FIRST_X_COORD) 
    /xCoordNumbers; 
    int yLength = (Y_AXIS_SECOND_Y_COORD - Y_AXIS_FIRST_Y_COORD) 
    /yCoordNumbers; 

    // draw x-axis numbers 
    for(int i = 1; i < xCoordNumbers; i++) { 
    g2.drawLine(X_AXIS_FIRST_X_COORD + (i * xLength), 
    X_AXIS_Y_COORD - SECOND_LENGHT, 
    X_AXIS_FIRST_X_COORD + (i * xLength), 
    X_AXIS_Y_COORD + SECOND_LENGHT); 
    g2.drawString(Integer.toString(i), 
    X_AXIS_FIRST_X_COORD + (i * xLength) - 3, 
    X_AXIS_Y_COORD + AXIS_STRING_DISTANCE); 
    } 

    //draw y-axis numbers 
    for(int i = 1; i < yCoordNumbers; i++) { 
    g2.drawLine(Y_AXIS_X_COORD - SECOND_LENGHT, 
    Y_AXIS_SECOND_Y_COORD - (i * yLength), 
    Y_AXIS_X_COORD + SECOND_LENGHT, 
    Y_AXIS_SECOND_Y_COORD - (i * yLength)); 
    g2.drawString(Integer.toString(i), 
    Y_AXIS_X_COORD - AXIS_STRING_DISTANCE, 
    Y_AXIS_SECOND_Y_COORD - (i * yLength)); 
    } 
} 
} 

这里是我想要添加的类Point:

class Point{ 
     public int x,y; 

     public Point(int x,int y){ 
      this.x=x; 
      this.y=y; 
     } 
     public Point FromCartToPix() { 
      this.x=X_AXIS_FIRST_X_COORD+(x*xLength); 
      this.y=Y_AXIS_SECOND_Y_COORD - (y * yLength); 
      return this; 

     } 
     public int GetX(){ 
      return this.x; 
     } 
     public int GetY(){ 
      return this.y; 
     } 
     public void DrawPoint(){ 
      g2.fillOval(
        this.FromCartToPix().Getx(), 
        this.FromCartToPix().Gety(), 
        ORIGIN_COORDINATE_LENGHT, ORIGIN_COORDINATE_LENGHT); 
     } 
} 

Java的手册,我有,刚一关于Java Graphics和Swing的小章,因此我无法实现这个类。我认为应该里面

PaintComponent(Graphics g) 

被插入,否则我将无法使用

g2.filloval 

但我不能使用

Point a = new Point (2,3); 

主要

我知道这是一个模糊和普遍的问题,但我无法让它工作。我搜索了很多关于Graphics2D g2 =(Graphics2D)g的用法,但是找不到精确的解释,甚至在Javadocs上也是如此。

如果妳知道解释它的链接我将不胜感激

在此先感谢

+0

可能的[复制](http://stackoverflow.com/q/9371961/230513)。 – trashgod

回答

3

Point类没有进入CartesianPanelGraphics2D对象。

您应该将FromCartToPixDrawPoint方法的功能移至CartesionPanel。通过这种方式,您实际上可以绘制点并将用户界面(CartesionPanel)中的数据(Point)分开。

// add in CartesionPanel 
private List<Point> points = new ArrayList<>(); 

public void drawPoint(Point point) { 
    points.add(point); 
    repaint(); 
} 

private void drawPointOnPanel(Point point, Graphics g) { 
    final int pointDiameter = 5; 
    final int x = X_AXIS_FIRST_X_COORD + (point.x * xLength) - pointDiameter/2; 
    final int y = Y_AXIS_SECOND_Y_COORD - (point.y * yLength) - pointDiameter/2; 
    g.fillOval(x, y, pointDiameter, pointDiameter); 
} 

public void paintComponent(Graphics g) { 
    // existing code ... 

    // draw points 
    points.forEach(p -> drawPointOnPanel(p, g)) 
} 

在你main功能,您可以通过绘制Point S:

CartesianFrame frame = new CartesianFrame(); 
frame.showUI(); 

frame.panel.drawPoint(new Point(3, 4)); 
+0

我甚至不知道在java中有一个.forEach。所以它基本上遍历每个点并使用drawPointOnPanel方法打印它们?那么可变点的名称(如点s)呢?我只需要做:Point s = new Point(3,4)然后frame.panel.drawPoint(s); – Spinnaker

+1

@Spinnaker ['.forEach'](https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html)方法是新的Java 8.您正确理解它,是的。 –