2015-06-20 36 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.您正確理解它,是的。 –