Java-在主方法和绘图方法之间传递变量时遇到问题

Java-在主方法和绘图方法之间传递变量时遇到问题,java,swing,variables,drawing,Java,Swing,Variables,Drawing,我正在创建一个dots and Box程序,并尝试将坐标值从主方法输入到JFrame类中的paintComponent方法。但是,我必须输入(Graphics g)参数,我看不到一种方法可以绕过它输入值。这可能是一个很大的畏缩,因为我仍在起步,但任何帮助都会很好 import javax.swing.*; import java.awt.*; import java.util.Scanner; public class Main { public static void main(Str

我正在创建一个dots and Box程序,并尝试将坐标值从主方法输入到JFrame类中的paintComponent方法。但是,我必须输入(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;
        }

    }

}
import javax.swing.*;
导入java.awt.*;
导入java.util.Scanner;
公共班机{
公共静态void main(字符串[]args){
JFrame f=新的JFrame(“点和框”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
图纸a=新图纸();
f、 添加(a);
f、 设置大小(1440990);
f、 setVisible(真);
扫描仪输入=新扫描仪(System.in);
System.out.println(“您将在点网格上选择两个坐标,在它们之间放置一条线。”);
System.out.println(“确保它们垂直或水平(不是对角线)紧挨着彼此”);
内特克松;
内在的;
int xTwo;
int-yTwo;
布尔值=真;

对于(inti=0;i您不应该自己调用paintComponent。该方法在Java绘制窗口时调用。 原因是用户在大多数情况下不应该关心重新绘制。Java将决定何时重新绘制,例如在窗口最小化/最大化或调整大小时,或者在单击某个元素时

要绘制动画形状,您必须要求Java重新绘制窗口。您可以添加
f.revalidate()
以强制组件重新绘制。请参阅文档

在使用时要特别小心。不要在循环中调用它而不在帧之间等待,否则CPU会发疯的! 如果需要动画形状,请以固定速率调用
revalidate()
,例如60fps

在您的情况下,您可以简单地将扫描仪放入循环中,请求用户输入,处理它,然后重新绘制窗口

此外,revalidate()没有阻塞,它只会告诉Java组件树已经更改,必须重新绘制。但是当Java有时间时,它会这样做

编辑:正如我们在评论中所讨论的,为了给你的画提供数据,你必须给他这些信息。 首先,创建图形元素,让我们从点开始:

class Point {
    public float x, y;

    Point(float x, float y) {
       this.x = x;
       this.y = y;
    }
}
在图形中(谁实际上是您的场景,让我们重命名它),添加setter和List

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
        }
        ....
    }
}
课堂场景{
私有列表mPoints=newlinkedlist();
公共地址点(p点){
mPoints.add(p);
}
公共组件(图形g){
超级组件(g);
....
对于(点p:mPoints){
//在这里提出你的观点
}
....
}
}
有几种方法可以改进这个简单的示例。首先,您可以在Point类上添加一个paint(Graphics g)方法。 当您要添加另一种组件时,您应该创建一个基类项,并在图形项(点、框…)中扩展它,并将paint方法放在这个新的基类中。
这是一种不必为每种元素都列出一个列表的方法,然后您可以迭代项并调用paint,而不用担心它背后的类型(点、框…)

你似乎没有在绘图中调用任何方法,你的观点是什么?paintComponent不是一个swing方法吗?我很难将xOne、yOne、xTwo和yTwo带到paintComponent方法来画线。是的,paintComponent是一个方法,但你没有在你编写的代码中调用它。不过我真的不需要调用它,这是w帽行6-11正在运行。你不应该调用方法
paintComponent
。你只需要提供一个框列表。你的主循环将框的坐标放入这个列表中,方法
paintComponent
从列表中获取框并绘制它们。我明白你的意思,但我一直在处理输入用户从for循环将其放入后。我需要将其转到
paintComponent
方法,但我不知道如何操作。只需将元素传递给类“Drawing”。可以是在创建时,也可以使用setter。您可以将绘图视为场景管理器或类似的内容。我建议您创建一个“Box”类和/或“Point”类谁将处理您想要绘制的这两种对象。然后,当用户输入了一些有趣的信息后,为ex.Point(50,50)创建并将其添加到场景(drawing.add(new Point(50,50))。在painComponent中,只需迭代您的项目列表