0
我必须在ANSI项目上工作,它需要一些2D数组。我有一个基类的派生类(基类是一个2D对象数组)。当我尝试将较小的(形状)数组添加到较大的(地图)数组中时,它会覆盖较大阵列的尺寸。2个不同的继承类覆盖
代码:
基类
public class pixelGrid
{
private static pixelCell[][] bitMap;
private static pixelCell defaultCell;
public pixelGrid()
{
defaultCell = new pixelCell();
}
public pixelGrid(int width, int height)
{
bitMap = new pixelCell[width][height];
defaultCell = new pixelCell();
}
public static void setDimension(int width, int height)
{
bitMap = new pixelCell[width][height];
}
//...
}
较小网格:
import java.util.Scanner;
import java.io.*;
public class shape extends pixelGrid
{
public String name;
private static boolean hasDimension;
private static boolean hasDefaultCell;
public shape(String n)
{
name = n;
hasDimension = false;
hasDefaultCell = false;
draw();
}
public void draw()
{
try(Scanner parser = new Scanner(new File (name +".cmd")))
{
String commandToken = parser.nextLine();
System.out.println("Line(shape): " + commandToken);
while(commandToken.charAt(0) != 'q')
{
Scanner sc = new Scanner(commandToken);
String commandLine = sc.next();
System.out.println("command(shape):" + commandLine);
if(commandLine.equals("d") && !hasDimension)
{
setDimension(commandToken);
hasDimension = true;
}
else if(commandLine.equals("b") && !hasDefaultCell)
{
setDefaultCell(commandToken);
hasDefaultCell = true;
}
else if(hasDimension && hasDefaultCell)
{
char command = commandToken.charAt(0);
switch(command)
{
case 'l':
drawLine(commandToken);
break;
case 'c':
drawCircle(commandToken);
break;
case 'p':
drawPoint(commandToken);
break;
case 'e':
erase(commandToken);
break;
case 'x':
ANSI.cls();
break;
default:
commandToken = parser.nextLine();
break;
}
}
commandToken = parser.nextLine();
}
}
catch(IOException e)
{
System.out.println("\nError reading input file(from shape): " + name);
e.printStackTrace();
}
}
private static void setDefaultCell(String command)
{
Scanner parser = new Scanner(command);
parser.next();
String token = parser.next();
char c;
if(token.equals("space"))
{
c = ' ';
}
else
{
c = token.charAt(0);
}
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
setDefaultCell(cell);
clearMap(getDefaultCell());
System.out.println("Default Cell: " + getDefaultCell());
}
private static void setDimension(String command)
{
Scanner parser = new Scanner(command);
System.out.println("command(shape): " + command);
parser.next();
int w = parser.nextInt();
int h = parser.nextInt();
setDimension(w,h);
System.out.println("Dimensions: " + getWidth() + " x " + getHeight());
}
//...
}
更大网格
个public class bitMap extends pixelGrid
{
public bitMap(int width, int height)
{
super(width, height);
}
public void addShape(int x, int y, shape s)
{
int shapeX = 0;
int shapeY = 0;
System.out.println("Dimensions(map): " + getWidth() + " x " + getHeight());
System.out.println("Dim(shape): " + x + " , " + y + " " + s.getWidth() + " x " + s.getHeight());
for(int w = x; w < (x + s.getWidth()); w++)
{
for(int h = y; h < (y + s.getHeight()); h++)
{
setCell(w,h,s.getCell(shapeX,shapeY));
shapeY++;
}
shapeX++;
shapeY = 0;
}
}
//...
}
调试结果:
尺寸(地图>预形状PROC):200×100
线(形状):d 10 10
命令(形状):d
指令(形状):d 10 10
种尺寸:10×10
尺寸(图>后形状创作):10×10
编辑:
这是我的主要方法:
主:
public class project2
{
private static bitMap map;
private static boolean hasDimension;
private static boolean hasDefaultCell;
public project2()
{
hasDimension = false;
hasDefaultCell = false;
}
public static void main(String args[])
{
try(Scanner parser = new Scanner(new File(args[0])))
{
String commandToken = parser.nextLine();
System.out.println("Line: " + commandToken);
while (commandToken.charAt(0) != 'q')
{
Scanner sc = new Scanner(commandToken);
String commandLine = sc.next();
System.out.println("command:" + commandLine);
if(commandLine.equals("d") && !hasDimension)
{
System.out.println("checkPoint! " + commandToken);
setDimension(commandToken);
hasDimension = true;
}
else if(commandLine.equals("b") && !hasDefaultCell)
{
System.out.println("checkPoint! " + commandToken);
setDefaultCell(commandToken);
hasDefaultCell = true;
}
else if(hasDimension && hasDefaultCell)
{
char command = commandToken.charAt(0);
System.out.println("checkPoint! " + commandToken);
switch(command)
{
case 'e':
erase(commandToken);
break;
case 'x':
ANSI.cls();
break;
default:
processShape(commandToken);
break;
}
}
commandToken = parser.nextLine();
}
}
catch(ArrayIndexOutOfBoundsException e)
{
if(e.getMessage().equals("p"))
{
System.out.println("\nPlot - ArrayIndexOutOfBoundsException\n\n");
}
else
{
System.out.println("\nError reading input file: " + args[0]);
e.printStackTrace();
}
}
catch(IOException e)
{
System.out.println("\nError reading input file(from main): " + args[0]);
e.printStackTrace();
}
catch (Exception e)
{
throw e;
}
ANSI.cls();
map.printMap();
System.out.println("Dimensions(map): " + map.getWidth() + " x " + map.getHeight());
}
private static void processShape(String command)
{
Scanner parser = new Scanner(command);
String name = parser.next();
int x = parser.nextInt();
int y = parser.nextInt();
String o = parser.next();
parser.close();
System.out.println("Shape Name: "+ name);
System.out.println("Location: " + x + " , " + y);
System.out.println("Dimensions(Map > pre-shape-proc): " + map.getWidth() + " x " + map.getHeight());
bitMap b = new bitMap(map.getWidth(),map.getHeight());
System.out.println("Dimensions(Map > pre-shape-proc): " + b.getWidth() + " x " + b.getHeight());
shape s = new shape(name);
System.out.println("Dimensions(map > after-shape-creation): " + map.getWidth() + " x " + map.getHeight());
System.out.println("Dimensions(Map > after): " + b.getWidth() + " x " + b.getHeight());
System.out.println("Shape Dimension: " + s.getWidth() + " x " + s.getHeight());
map.addShape(x,y,s);
}
private static void setDefaultCell(String command)
{
Scanner parser = new Scanner(command);
parser.next();
String token = parser.next();
char c;
if(token.equals("space"))
{
c = ' ';
}
else
{
c = token.charAt(0);
}
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
map.setDefaultCell(cell);
map.clearMap(map.getDefaultCell());
System.out.println("Default Cell: " + map.getDefaultCell());
}
private static void setDimension(String command)
{
Scanner parser = new Scanner(command);
System.out.println("command: " + command);
parser.next();
int w = parser.nextInt();
int h = parser.nextInt();
map = new bitMap(w,h);
System.out.println("Dimensions: " + map.getWidth() + " x " + map.getHeight());
}
public static void erase(String command)
{
Scanner parser = new Scanner(command);
parser.next();
char c = parser.next().charAt(0);
int fg = ANSI.color2Int(parser.next());
int bg = ANSI.color2Int(parser.next());
parser.close();
pixelCell cell = new pixelCell(c,fg,bg);
map.clearMap(cell);
}
}
你可以发布你的'main'方法吗? – Turing85
您的'pixelGrid'构造函数重新初始化'static'属性.defaultCell',因此类的第二个实例化“重置”所有值。 (对于'bitMap'与第二个ctor相同) – tomse
@tomse是否意味着每个派生类都不会创建'static'变量?还是我误解了? –