Пересметить систему координат на JavaFX

352
22 июня 2017, 03:39

Так как я только недавно начал работать с JavaFX, то многое еще не знаю. Я хотел написать программу на JavaFX с помощью Canvas API, которая рисует систему координат и график введенной функции. Так же с помощью мыши хочу перемещать положение экрана (координатную систему вместе с графиком). Нарисовать я смог. Но не как не получается всю эту область перемещать так, чтобы и новые границы появлялись автоматически нарисовывались. Например, если график функции вначале не виден, то, перетаския положение, могу до не него добраться. Вот это я хочу сделать. Надеюсь, что доходчиво объяснил свою проблему.

На обычном Java JPanel получается и нарисовать, и перемещать область с помощью мыши. Вот, собственно, этот код:

import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MouseDragTest extends JPanel {
    private static final int WIDTH = 640;
    private static final int HEIGHT = 480;
    private Point origin = new Point(WIDTH / 2, HEIGHT / 2);
    private Point mousePt;
    private double einheit = 40;
    private int x_start, y_start;
    public MouseDragTest() {
        this.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
        label = new Label("Move");
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                mousePt = e.getPoint();
                repaint();
            }
        });
        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                int dx = e.getX() - mousePt.x;
                int dy = e.getY() - mousePt.y;
                origin.setLocation(origin.x + dx, origin.y + dy);         
                mousePt = e.getPoint();
                repaint();
            }
        });
    }
    @Override
    public Dimension getPreferredSize() {
        return new Dimension(WIDTH, HEIGHT);
    }
    public double f(double x) {
        //return 3/(Math.pow(x, 2));
        return Math.cos(x);
    }
    public void draw(Graphics g, int i, int j) {
        if ((j > 0) && (j < HEIGHT) && (y_start > 0) && (y_start < HEIGHT)) {
            g.drawLine(x_start, y_start, i, j);
        }
        x_start = i;
        y_start = j;
    }

    public void coordinateSystem(Graphics g) {
        g.drawLine(5, origin.y, WIDTH - 5, origin.y); // x_Achse
        g.drawLine(origin.x, 5, origin.x, HEIGHT - 5); // y_Achse
        System.out.println("Breite " + WIDTH);
        //Positive x- und y-Achsen
        for (int i = 1; i < WIDTH; i++) {
            g.drawLine(origin.x + (int) einheit * i, origin.y - 2,
                    origin.x + (int) einheit * i, origin.y + 2);  //    Einheiten /Markierungen auf der positiven x_Achse
            g.drawString("" + i, (origin.x + (int) einheit * i) - 3, origin.y + 15); //    //Textbeschriftungen auf der positiven x_Achse
        }
        for (int i = 1; i < HEIGHT; i++) {
            g.drawLine(origin.x - 2, origin.y - (int) einheit * i,
                    origin.x + 2, origin.y  - (int) einheit * i); //   Einheiten / Markierungen auf der positiven y_Achse            
            g.drawString("" + i, origin.x - 15, (origin.y - (int) einheit * i) + 3); //    Textbeschriftungen auf der positiven y_Achse
        }
        //Negative x- und y-Achsen
        for (int i = 1; i < WIDTH; i++) {
            g.drawLine(origin.x + (int) einheit * (-i), origin.y - 2,
                    origin.x + (int) einheit * (-i), origin.y + 2);  //    Einheiten /Markierungen auf der positiven x_Achse
            g.drawString("" + (-i), (origin.x + (int) einheit * (-i)) - 6, origin.y + 15); //    //Textbeschriftungen auf der negativen x_Achse
        }
        for (int i = 1; i < HEIGHT; i++) {
            g.drawLine(origin.x - 2, origin.y - (int) einheit * (-i),
                    origin.x + 2, origin.y  - (int) einheit * (-i)); //   Einheiten / Markierungen auf der positiven y_Achse            
            g.drawString("" + (-i), origin.x - 18, (origin.y - (int) einheit * (-i)) + 6); //    Textbeschriftungen auf der negativen y_Achse
        }
    }
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        double x, y;
        int j;
        coordinateSystem(g);
        x = (0 - origin.x) / einheit; // Erster Punkt zum Zeichnen
        y = f(x);
        j = (int) Math.round(origin.y - y * einheit);
        x_start = 0;
        y_start = j;
        for (int i = 1; i < WIDTH; i++) {
            x = (i - origin.x) / einheit;
            y = f(x);
            j = (int) Math.round(origin.y - y * einheit);
            draw(g, i, j);
        }
    }
}

Как мне теперь этот код перевести на JavaFX?

READ ALSO
Нужен ли вызов Bitmap.recycle()

Нужен ли вызов Bitmap.recycle()

Подскажите, пожалуйста, необходим ли вызов Bitmaprecycle() в таком случае:

320
Поиск дубликатов в списке

Поиск дубликатов в списке

Какой самый эффективный метод поиска дубликата в списке?

200
Cannot resolve method getFilter + Attempt to invoke interface method

Cannot resolve method getFilter + Attempt to invoke interface method

Я пытаюсь добавить SearchView в приложение

250