Java 如何使方法中的变量可用于类中的所有其他方法?

Java 如何使方法中的变量可用于类中的所有其他方法?,java,swing,Java,Swing,我是一个编程新手,想学习更多的java。我目前正在高中学习一门编程入门课程,我只是想在课外玩玩。我正在创建的这个程序应该在控制台中打印出一些说明和问题,我希望使用扫描仪和变量检索用户输入。该程序的目标是让用户能够根据纯粹的直觉创建一个“图形”,然后在事实发生后显示该图形 这是我的问题。我询问用户并将信息存储在main方法固有的变量中,但我需要在paintComponent方法中使用这些信息 我尝试在变量前面添加static,例如: static int emptyRectW1=kboard.ne

我是一个编程新手,想学习更多的java。我目前正在高中学习一门编程入门课程,我只是想在课外玩玩。我正在创建的这个程序应该在控制台中打印出一些说明和问题,我希望使用扫描仪和变量检索用户输入。该程序的目标是让用户能够根据纯粹的直觉创建一个“图形”,然后在事实发生后显示该图形

这是我的问题。我询问用户并将信息存储在main方法固有的变量中,但我需要在paintComponent方法中使用这些信息

我尝试在变量前面添加static,例如:
static int emptyRectW1=kboard.nextInt()但这只是显示错误“参数emptyRectW1的非法修饰符;只允许使用final。”

我知道这是一个漫长的尝试,但这是我最好的

我正在使用JavaEclipse作为我的IDE。 谢谢你的帮助,看来唯一的学习方法就是把事情搞砸,让别人指出我的错误!:)

代码如下:

import java.util.Scanner;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Container;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BlindDrawing extends JPanel {
    public static void main (String[] args) {
        Scanner kboard = new Scanner(System.in);
        System.out.println("Welcome to the Blind Drawing Game!");
        System.out.println("In this game, you will be asked questions about how to construct an image using rectangles and ovals. You will be asked the shape's dimensions and position. The origin (0,0) is the top left corner.");
        System.out.println("First you're making an empty rectangle, how wide do you want it to be?");
        int emptyRectW1 = kboard.nextInt();
        System.out.println("What about the height?");
        int emptyRectH1 = kboard.nextInt();

    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(0,0,emptyRectW1, emptyRectH1);
    }
}

简单的答案是:通过方法或构造函数的参数将main方法中获得的信息传递给BlindDrawing对象

但是,您确实不想将线性控制台类型的应用程序与事件驱动的GUI应用程序混合使用。选择其中一个并坚持下去。在这里,如果需要在启动主GUI应用程序之前获取JOptionPanes,您可以通过JOptionPanes获取所需的信息,然后再次将它们传递到主GUI应用程序中,如上所述——通过构造函数参数

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

import javax.swing.*;

public class BlindDrawing extends JPanel {
    private Rectangle rectangle;

    public BlindDrawing(Rectangle rectangle) {
        setPreferredSize(new Dimension(1000, 800));
        this.rectangle = rectangle;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (rectangle != null) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.RED);
            g2.draw(rectangle);
        }
    }

    private static void createAndShowGui(Rectangle rect) {
        BlindDrawing mainPanel = new BlindDrawing(rect);

        JFrame frame = new JFrame("BlindDrawing");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        String message = "Enter 4 numbers for X, Y, Width, and Height, separated by a space";
        String title = "Get Rectangle Coordinates";
        int messageType = JOptionPane.PLAIN_MESSAGE;
        String input = JOptionPane.showInputDialog(null, message, title, messageType);
        String[] tokens = input.split("\\s+");
        if (tokens.length == 4) {
            int x = Integer.parseInt(tokens[0]);
            int y = Integer.parseInt(tokens[1]);
            int width = Integer.parseInt(tokens[2]);
            int height = Integer.parseInt(tokens[3]);
            Rectangle rect = new Rectangle(x, y, width, height);
            SwingUtilities.invokeLater(() -> createAndShowGui(rect));
        }
    }
}
// get our line of input same as we did before
String input = JOptionPane.showInputDialog(null, message, title, messageType);

// create a Scanner object that scans through the line
Scanner inputScanner = new Scanner(input);

// extract the four numbers from the line
int x = inputScanner.nextInt();
int y = inputScanner.nextInt();
int width = inputScanner.nextInt();
int height = inputScanner.nextInt();

// close the Scanner so we don't waste resources
inputScanner.close();

编辑

你在评论中问道:

我不明白的是那些底部有记号的。我真的不明白这些代币是做什么的,如果你能澄清一下,那就太好了

对我来说,问题是:我们如何才能最容易地允许用户输入Int以在Swing应用程序中使用,但为了进一步细分,我们可以要求编码器最容易的解决方案和用户最容易的解决方案。一般来说,你会更喜欢追求后者

编码器最简单的方法是创建一个简单的控制台应用程序,让用户使用字符串提示和已初始化为标准输入或
系统的扫描仪对象输入数字。正如我所提到的,虽然这对编码人员来说很容易,但对用户来说却不太好,因为控制台应用程序和GUI应用程序不能很好地结合在一起,因为一个应用程序是以线性方式构建的,而另一个应用程序则更为自由流动和事件驱动。如果您希望在程序运行时稍后获取数据,并且再次让用户通过控制台输入信息,则可能会冻结Swing应用程序,使其变得无用,或者在后台线程中不适当地更新Swing应用程序

我上面的解决方案是一种折衷方案,我们使用
JOptionPane.showInputDialog(…)
提示用户输入单个字符串。这将给用户一个提示,并允许用户在文本字段中输入单个字符串。在这里,我要求用户输入四个数字,每个数字之间用空格隔开,我认为您理解这一部分,但其中的一个问题是,一旦您得到字符串,我称之为
input
,如何从中提取四个数字

一种方法是使用String的
split(…)
方法将字符串拆分为字符串数组(我称之为
tokens
)。一个简单的方法是:

String[] tokens = input.split(" ");
这将通过在单个空间上拆分将输入字符串拆分为子字符串数组。如果用户不小心在数字之间使用了多个空格,或者使用了不同的“空白”来分隔数字,那么这种方法就不能很好地工作。我改为:

String[] tokens = input.split("\\s+");
它使用称为正则表达式或缩写为“regex”的东西来拆分字符串
\\s
表示任何空白字符,
+
表示我们将拆分为一个或多个空白字符。因此,如果用户在数字之间放置2或3个空格,这仍然有效

拆分此字符串的另一种可能方法是将其放入扫描仪,然后“扫描”INT。在这里,我们不使用标准输入和System.in进行扫描,而是扫描输入的字符串,这里是
input
。例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

import javax.swing.*;

public class BlindDrawing extends JPanel {
    private Rectangle rectangle;

    public BlindDrawing(Rectangle rectangle) {
        setPreferredSize(new Dimension(1000, 800));
        this.rectangle = rectangle;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (rectangle != null) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.RED);
            g2.draw(rectangle);
        }
    }

    private static void createAndShowGui(Rectangle rect) {
        BlindDrawing mainPanel = new BlindDrawing(rect);

        JFrame frame = new JFrame("BlindDrawing");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        String message = "Enter 4 numbers for X, Y, Width, and Height, separated by a space";
        String title = "Get Rectangle Coordinates";
        int messageType = JOptionPane.PLAIN_MESSAGE;
        String input = JOptionPane.showInputDialog(null, message, title, messageType);
        String[] tokens = input.split("\\s+");
        if (tokens.length == 4) {
            int x = Integer.parseInt(tokens[0]);
            int y = Integer.parseInt(tokens[1]);
            int width = Integer.parseInt(tokens[2]);
            int height = Integer.parseInt(tokens[3]);
            Rectangle rect = new Rectangle(x, y, width, height);
            SwingUtilities.invokeLater(() -> createAndShowGui(rect));
        }
    }
}
// get our line of input same as we did before
String input = JOptionPane.showInputDialog(null, message, title, messageType);

// create a Scanner object that scans through the line
Scanner inputScanner = new Scanner(input);

// extract the four numbers from the line
int x = inputScanner.nextInt();
int y = inputScanner.nextInt();
int width = inputScanner.nextInt();
int height = inputScanner.nextInt();

// close the Scanner so we don't waste resources
inputScanner.close();

这仍然存在问题,因为如果用户输入2或3个数字而不是4,或者如果用户输入非数字输入,所有这些解决方案都会失败,并且还有其他检查和更正的方法,例如使用JSpinner或JComboBox将用户的选择限制为允许的数字,或者使用try/catch块捕获无效输入,然后提示用户输入更正确的输入。

简单的答案是:通过方法或构造函数的参数将在main方法中获得的信息传递到BlindDrawing对象

但是,您确实不想将线性控制台类型的应用程序与事件驱动的GUI应用程序混合使用。选择其中一个并坚持下去。在这里,如果需要在启动主GUI应用程序之前获取JOptionPanes,您可以通过JOptionPanes获取所需的信息,然后再次将它们传递到主GUI应用程序中,如上所述——通过构造函数参数

例如:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;

import javax.swing.*;

public class BlindDrawing extends JPanel {
    private Rectangle rectangle;

    public BlindDrawing(Rectangle rectangle) {
        setPreferredSize(new Dimension(1000, 800));
        this.rectangle = rectangle;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (rectangle != null) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setColor(Color.RED);
            g2.draw(rectangle);
        }
    }

    private static void createAndShowGui(Rectangle rect) {
        BlindDrawing mainPanel = new BlindDrawing(rect);

        JFrame frame = new JFrame("BlindDrawing");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        String message = "Enter 4 numbers for X, Y, Width, and Height, separated by a space";
        String title = "Get Rectangle Coordinates";
        int messageType = JOptionPane.PLAIN_MESSAGE;
        String input = JOptionPane.showInputDialog(null, message, title, messageType);
        String[] tokens = input.split("\\s+");
        if (tokens.length == 4) {
            int x = Integer.parseInt(tokens[0]);
            int y = Integer.parseInt(tokens[1]);
            int width = Integer.parseInt(tokens[2]);
            int height = Integer.parseInt(tokens[3]);
            Rectangle rect = new Rectangle(x, y, width, height);
            SwingUtilities.invokeLater(() -> createAndShowGui(rect));
        }
    }
}
// get our line of input same as we did before
String input = JOptionPane.showInputDialog(null, message, title, messageType);

// create a Scanner object that scans through the line
Scanner inputScanner = new Scanner(input);

// extract the four numbers from the line
int x = inputScanner.nextInt();
int y = inputScanner.nextInt();
int width = inputScanner.nextInt();
int height = inputScanner.nextInt();

// close the Scanner so we don't waste resources
inputScanner.close();

编辑

你在评论中问道:

我不明白的是那些底部有记号的。我真的不明白这些代币是做什么的,如果你能澄清一下,那就太好了

我的问题是:我们如何最容易地允许用户输入用于Swing应用程序的Int