0

这是我的第一篇文章,我对编程非常陌生(自学)。如果我的术语不完全符合标准或我犯了任何其他失礼,请原谅我。我正在尝试编写一个使用两个类的程序,以便获取用户输入并使用该输入在屏幕上绘制一个简单的矩形。我已经完成了所有工作,但我无法识别用户生成的内容。我已经定义了一个“x”变量,用户为此输入了一个值,但该值每次都以“0”的形式传递。系统会提示用户输入一个整数值,该整数值将在创建填充矩形时用作“x”值。但是,在运行时,x 值始终为“0”。不知何故,变量“x”没有更改为用户输入的值。

下面是我的代码,尽管它可能很糟糕。希望有人能给我一些想法。

主要课程

import javax.swing.JFrame;
import java.awt.*;
import java.util.*;

public class first {


    public static void main(String[] args) {

        second p = new second();
        p.setValues();
        p.getX();
        JFrame j = new JFrame("New Rectangle");
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        second t = new second();
        j.add(t);
        j.setSize(500,500);
        j.setVisible(true);


    }

}

二等

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;

public class second extends JPanel{
     int x;

    public void setValues()
    {
        Scanner s = new Scanner(System.in);
        System.out.println("Enter the X value");
        x = s.nextInt();

    }



    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(Color.WHITE);

        System.out.println(x);
        g.setColor(Color.BLUE);
        g.fillRect(x, 20, 50, 50);

    }
}
4

2 回答 2

1

看起来问题是您使用名为 的变量引用的对象收集信息p,但随后您使用变量引用的对象绘制到屏幕上t。变量不会在类之间共享,除非它们是静态的 - 请查看此文档以获取更多信息。

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

帮助可视化这一点的一种方法是将一个类视为一个蓝图。您正在描述数据的外观以及如何使用它。当您准备好从您的蓝图构建某些东西时,您可以使用new关键字。此时,根据您对蓝图的描述,您有了一个新对象,即类文件。

举一个现实世界的例子:如果你有一个特定类型的房子的蓝图,而你和我都完全按照这个蓝图的规格建造了我们的房子,我们可以说我们有相同的房子。但事实上,我们没有;如果我有 20 只猫,我的房子很臭,你的房子就不会臭了。我们的平面图是相同的,但我们每个房子里的实际情况却大不相同。

要使代码工作,只需去掉t变量,然后调用j.add(p);

编辑:添加更多细节。该值始终为 0 的原因是因为 Java 在初始初始化时为原始类型选择了默认值。在整数的情况下,默认值为 0。

于 2013-08-25T00:40:21.793 回答
0

x 值始终为 0 的原因是因为当您说时您正在创建它的另一个实例

second t = new second(); //Creates a new instance of x (another copy of x)

如果你只是这样做System.out.print(p.x);p.setValues()你会得到正确的 x 值。

就您的代码而言,我不太明白 p 存在的原因。只是做这样的事情应该有效:

    JFrame j = new JFrame("New Rectangle");
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

   second t = new second();

   t.setValues();
   j.add(t);
   j.setSize(500, 500);
   j.setVisible(true);
于 2013-08-25T00:41:01.653 回答