2015-06-20 5 views
1

После изучения циклов, массивов, методов, ... Я начал играть с графикой, но у меня возникли некоторые проблемы. Я искал пример, когда увидел это: http://javaceda.blogspot.ch/2010/06/draw-cartesian-coordinate-system-in.htmlКартезианская плоскость в Java

Он представляет собой пример декартовой плоскости в Java. Я могу понять почти все из этого кода (за исключением нескольких строк, таких как invokelater, SwingUtilities, и я посмотрю на них позже).

Предположим, что теперь я хочу создать класс «Точка» с помощью конструкторов, геттеров, метод, который преобразует декартовы координаты точки в «пиксельные координаты» и метод, который печатает точку на плоскости.

Итак, вот код, взятый из ссылки:

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

Вот класс точка, что я хочу добавить:

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 класс не имеет доступ к Graphics2D объекту CartesianPanel.

Вы должны переместить функциональность своих методов FromCartToPix и DrawPoint на CartesionPanel. Таким образом, вы можете нарисовать точки и отделить данные (Point) от пользовательского интерфейса (CartesionPanel).

// 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 комиссионка:

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. Вы понимаете это правильно, да , –

Смежные вопросы