import java.io.*;
import java.util.*;
import java.awt.*;
public class PracDriver {
public static void main ( String[] args) throws FileNotFoundException{
DrawingPanel panel = new DrawingPanel(600, 600);
Graphics g = panel.getGraphics();
Picture pic1 = new Picture<>();
Scanner read = new Scanner(System.in);
String filename = read.nextLine();
File file = new File(filename);
System.out.println(filename);
read.close();
Scanner in = new Scanner("start picture A");
in.useDelimiter(" ");
while(in.hasNextLine()){
String token1 = in.next();
if (token1.equalsIgnoreCase("start")){
System.out.println("john");
String token2 = in.next();
if(token2.equalsIgnoreCase("picture")){
System.out.println("doe");
char t = in.next().charAt(0);
Picture t = new Picture();
}
else{
System.out.println("Improper imput from file");
}
}
else if (token1.equalsIgnoreCase("end")){
System.out.println("john");
String token2 = in.next();
if(token2.equalsIgnoreCase("picture")){
System.out.println("doe");
}
}
else if(token1.equalsIgnoreCase("erase")){
g.setColor(Color.WHITE);
g.drawRect(0, 0, 600, 600);
g.fillRect(0, 0, 600, 600);
g.setColor(Color.BLACK);
}
else if(token1.equalsIgnoreCase("cirlce")){
int token2 = in.nextInt();
int token3 = in.nextInt();
int token4 = in.nextInt();
Circle circ = new Circle("circ", token2, token3, token4);
pic1.addShape(circ);
}
所以,在我的扫描仪中,我有一些测试代码(它应该从文件读取,但这并不重要),它读取“开始图片A”。我有一个分隔符,所以它分别读取每个字符串。它包含'开始'和'图片'部分,似乎工作正常。问题是我的图片必须以“开始图片”之后的字符命名,在这种情况下是A.所以我需要接受该字符的输入,然后在其后面命名我的Picture变量。所以在这种情况下,我需要将Picture称为Picture A = new Picture();.问题是我不知道该怎么做。我无法将char转换为我的Picture类对象。另一个问题是,我的if else语句的其余部分也需要使用新的Picture(在这种情况下是图片A)来添加Shapes(我的类)。但是这不会对局部变量起作用。我很感激任何帮助。也忽略图片p1。需要将其删除或更换。
答案 0 :(得分:0)
你问的问题不是你真正想要实现的目标。
Picture A = new Picture()
^ ^ ^
| | |
Class Variable Object
您希望new Picture()
对象被称为A
。但是A
是变量名,因此java编译器和运行时知道访问new Picture()
对象的内存地址。这不是对象的名称或与对象关联的数据的指示。通常,大多数课程都会定义一个名称&#39;可以从您的对象访问的属性(注意我不确定您的Picture对象的类定义是什么)
Picture pic = new Picture();
pic.setName("A");
另请注意,在您的代码中:
if(token2.equalsIgnoreCase("picture")){
System.out.println("doe");
char t = in.next().charAt(0);
Picture t = new Picture();
}
你有2个名为t
的变量。这些不应该是对象价值的指示。再次定义变量,以便编译器和运行时知道您正在谈论的对象。第一个是char类型变量,因此将其称为c
或ch
,第二个变量是Picture类型变量,因此将其称为pic
或picture
。变量的命名提高了查看代码的未来开发人员的可读性。
同样在这段代码中,因为你在块中定义了变量,但是不在块中使用它们,编译器会发出一个警告,告诉你尽管你已经创建了变量,但是它们以后不会被引用因此,没有必要这样做。 IF 你试图稍后在这个块之外引用它们,编译器会引发错误,因为变量超出了定义它们的块的范围。
答案 1 :(得分:0)
您不能尝试做什么。但是,您正在做出严肃的设计决策,这些决策会让您尝试做的事情变得有点无关紧要,因为您可以使用其他方法来完成您想要的任务。
第一件事:您的代码,所有变量以及您在源文件中放置的任何应该在编译时已知的内容都被称为&#34;编译时间&#34;依赖关系或引用。 这些是java编译器在任何人甚至可以运行程序之前要求您指定的内容。 变量名称包含在此列表中(进一步详细说明将尝试教授基本Java,因此我不会在这里做到这一点......)
基于用户输入,您需要代码执行的任何操作都被称为&#34;运行时&#34;依赖关系或引用。命令行中的用户输入,从文件系统加载的文件,UI事件等都是构建编译代码以处理这些未知编译时项(因此,运行时)的示例。
如果需要根据某些用户输入识别对象,请在类中声明一个方法,您可以使用该方法分配用户输入值并创建所需的映射。
使用Map
是另一种可以将对象与键(键/值对)相关联并完成您尝试做的事情的方法。
示例:
public class Picture {
private String name;
// other properties omitted for clarity
public Picture() {
this.name = "some default";
}
// use getters/setters to access and assign object data, which can include
// user-input obtained at runtime
public String getName() { return this.name; }
public void setName(String name) { this.name = name; }
}
并且在您的代码中,您可以通过执行类似于您拥有的操作来利用此功能:
if (token1.equalsIgnoreCase("start")){
System.out.println("john");
String token2 = in.next();
if(token2.equalsIgnoreCase("picture")){
System.out.println("doe");
char inputChar = in.next().charAt(0); // use a more descriptive name...
Picture picture = new Picture();
picture.setName(Character.toString(inputChar)); // note the "generic" name for this picture object variable. The runtime information is stored in the object as a property.
}
else{
System.out.println("Improper imput from file");
}
}
这里重要的一点是要注意,用于引用对象的变量名称与程序在运行时的意图无关,它的意思是使用它在发展过程中确定目的和范围。