2015-05-07 90 views
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); 
    } 
} 
+1

你可以发布你的'main'方法吗? – Turing85

+1

您的'pixelGrid'构造函数重新初始化'static'属性.defaultCell',因此类的第二个实例化“重置”所有值。 (对于'bitMap'与第二个ctor相同) – tomse

+0

@tomse是否意味着每个派生类都不会创建'static'变量?还是我误解了? –

回答

0

问题是您的pixelGrid构造函数重新初始化静态属性defaultCell,因此该类(或其派生类之一)的第二个实例化会“重置”所有值。

public class pixelGrid 
{ 
    private static pixelCell defaultCell; 

    public pixelGrid() 
    { 
    // resets defaultCell 
    defaultCell = new pixelCell(); 
    } 
} 

相反,你应该eiter初始化直接static属性:

private static pixelCell defaultCell = new pixelCell(); 

或使用静态初始化块的(主要是如果有更多的不仅仅是一个new做)

private static pixelCell defaultCell; 

static { 
    defaultCell = new pixelCell(); 
} 

(如果每个派生类需要一次static属性,则必须分别在派生类中声明它。)

请参阅https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html