Java - Проблемы с передачей переменных между основным методом и методом рисования - PullRequest
0 голосов
/ 02 марта 2020

Я создаю программу многоточий и ящиков и пытаюсь передать значения координат из метода main, где пользователь вводит их, в метод paintComponent в классе JFrame. Однако мне нужно добавить параметр (Graphics g), и я не вижу способа обойти это значение. Вероятно, это большая неприятность, потому что я все еще начинаю, но любая помощь будет отличной.

import javax.swing.*;
import java.awt.*;
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        JFrame f = new JFrame("Dots & Boxes");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Drawing a = new Drawing();
        f.add(a);
        f.setSize(1440,990);
        f.setVisible(true);


        Scanner input = new Scanner(System.in);
        System.out.println("You will choose two coordinates on the dot grid to place a line between.");
        System.out.println("Make sure that they are right next to each other, either vertically or horizontally (not diagonal)");
        int xOne;
        int yOne;
        int xTwo;
        int yTwo;
        boolean playerOneTurn = true;
        for (int i = 0; i <= 760; i++){
            System.out.println("Pick Your First X-Coordinate: ");
            xOne = input.nextInt();
            System.out.println("Pick Your First Y-Coordinate: ");
            yOne = input.nextInt();
            System.out.println("Pick Your Second X-Coordinate: ");
            xTwo = input.nextInt();
            System.out.println("Pick Your Second Y-Coordinate: ");
            yTwo = input.nextInt();
            playerOneTurn = !playerOneTurn;
        }
    }

}

class Drawing extends JPanel {
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(Color.WHITE);

        setFont(new Font("TimesRoman", Font.PLAIN, 20));

        g.drawString("0", 75, 45);
        g.drawString("1", 110, 45);
        g.drawString("2", 145, 45);
        g.drawString("3", 180, 45);
        g.drawString("4", 215, 45);
        g.drawString("5", 250, 45);
        g.drawString("6", 285, 45);
        g.drawString("7", 320, 45);
        g.drawString("8", 355, 45);
        g.drawString("9", 390, 45);
        g.drawString("10", 417, 45);
        g.drawString("11", 452, 45);
        g.drawString("12", 487, 45);
        g.drawString("13", 522, 45);
        g.drawString("14", 557, 45);
        g.drawString("15", 592, 45);
        g.drawString("16", 627, 45);
        g.drawString("17", 662, 45);
        g.drawString("18", 697, 45);
        g.drawString("19", 732, 45);


        g.drawString("0", 40, 75);
        g.drawString("1", 40, 110);
        g.drawString("2", 40, 145);
        g.drawString("3", 40, 180);
        g.drawString("4", 40, 215);
        g.drawString("5", 40, 250);
        g.drawString("6", 40, 285);
        g.drawString("7", 40, 320);
        g.drawString("8", 40, 355);
        g.drawString("9", 40, 390);
        g.drawString("10", 35, 425);
        g.drawString("11", 35, 460);
        g.drawString("12", 35, 495);
        g.drawString("13", 35, 530);
        g.drawString("14", 35, 565);
        g.drawString("15", 35, 600);
        g.drawString("16", 35, 635);
        g.drawString("17", 35, 670);
        g.drawString("18", 35, 705);
        g.drawString("19", 35, 740);

        int dotx1 = 80;
        int doty1 = 70;
        ((Graphics2D) g).setStroke(new BasicStroke(5));

        for (int h = 0; h <= 19; h++) {
            for (int i = 0; i <= 19; i++) {
                g.drawLine(dotx1, doty1, dotx1, doty1);
                dotx1 = dotx1 + 35;
            }
            dotx1 = 80;
            doty1 = doty1 + 35;
        }

    }

}

1 Ответ

0 голосов
/ 02 марта 2020

Вы не должны вызывать paintComponent самостоятельно. Метод вызывается, когда Java рисует окно. Причина в том, что большую часть времени пользователь не должен заботиться о перерисовке. Java будет решать, когда перерисовывать, например, при сворачивании / уменьшении окна или изменении размера или когда элемент щелкается.

Чтобы нарисовать анимированные фигуры, вы должны попросить Java перерисовать ваше окно. Вы можете добавить f.revalidate(), чтобы принудительно перерисовать компоненты. Посмотрите документацию здесь .

Будьте очень осторожны при использовании этого. Никогда не вызывайте это внутри al oop без ожидания между кадрами, потому что ваш процессор будет go сумасшедшим, если нет! Если вы хотите анимированные фигуры, позвоните по номеру revalidate() с фиксированной скоростью, например, 60 к / с.

В вашем случае вы можете просто поместить свой сканер внутрь l oop, попросить пользователя ввести, обработать его и затем перерисовать окно.

Кроме того, revalidate () не блокирует, он просто скажет Java, что дерево компонентов изменилось и должно быть перерисовано. Но он сделает это, когда у него будет время для этого.

Редактировать: Как мы обсуждаем в комментариях, чтобы снабдить свой чертеж данными для рисования, вы должны предоставить ему информацию. Сначала создайте свои графические элементы, начните с точек:

class Point {
    public float x, y;

    Point(float x, float y) {
       this.x = x;
       this.y = y;
    }
}

В вашем чертеже (который на самом деле является вашей сценой, пусть переименует его) добавьте сеттеры и список

class Scene {
    private List<Point> mPoints = new LinkedList<Point>();

    public addPoint(Point p) {
        mPoints.add(p);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        ....
        for (Point p : mPoints) {
            // draw your points here
        }
        ....
    }
}

Есть несколько способов улучшить этот простой пример. Во-первых, вы можете добавить метод paint (Graphics g) в класс Point. Когда вы добавите компонент другого типа, вы должны создать базовый класс Item и расширить его в своих графических элементах (Point, Box ...) и поместить метод рисования в этот новый базовый класс. Это способ не иметь одного списка для каждого вида элементов, и тогда вы можете просто перебирать элементы и вызывать paint, не беспокоясь о том, что за ним стоит (Point, Box ...)

...