2014-09-07 2 views
0

Я не мог найти других решений для своей проблемы, потому что я не уверен, как описать ее в нескольких словах.Значения Java Object несовместимы

Когда я назначаю activeList, который является полем currentActiveList случайно сгенерированный прямоугольник в классе ActiveList, он получает значение просто отлично.

public class ActiveList { 
    Rectangle[] activeList = new Rectangle[10]; 

    public ActiveList() { 
     for(int i = 0; i < activeList.length; i++) 
      activeList[i] = null; 
    } 

    public void addToList(Rectangle x) { 
     for(int i = 0; i < this.activeList.length; i++) { 
      if(this.activeList[i] == null) { 
       this.activeList[i] = x; 
       i = this.activeList.length+1; 
      } 

      else 
       this.activeList[activeList.length-1] = x; 
     } 
    } 

    public Rectangle[] getActiveList() { 
     return this.activeList; 
    } 

    public int getLength() { 
     //System.out.print(this.activeList.length); 
     return this.activeList.length; 
    } 

    public void deleteFromList(int x) { 
     this.activeList[x] = null; 
    } 

    public Rectangle getFromList(int x) { 
     Rectangle retVal = this.activeList[x]; 
     //System.out.println("Returning getFromList(int x): " +retVal); 
     return retVal; 
    } 

    public void genRandomRectangle() { 
     Random randomNumberGenerator = new Random(); 
     double[] pointVal = new double[4]; 
     double randomInt = randomNumberGenerator.nextInt(400-10); 
     pointVal[0] = randomInt; 
     randomInt = randomNumberGenerator.nextInt(400-10); 
     pointVal[1] = randomInt; 
     randomInt = randomNumberGenerator.nextInt((int) (400-pointVal[0])); 
     if(randomInt < 5) { 
      randomInt = randomInt+pointVal[0]+5; 
     } 

     else 
      pointVal[2] = randomInt+pointVal[0]; 

     randomInt = randomNumberGenerator.nextInt((int) (400-pointVal[1])); 
     if(randomInt < 5) { 
      randomInt = randomInt+pointVal[1]+5; 
     } 

     else 
      pointVal[3] = randomInt+pointVal[1]; 

     Rectangle newRandom = new Rectangle(pointVal[0], pointVal[1], pointVal[2], pointVal[3]); 
     //System.out.println(pointVal[0]); 
     //System.out.println(pointVal[1]); 
     //System.out.println(pointVal[2]); 
     //System.out.println(pointVal[3]); 
     System.out.println("New Random: " +newRandom); 

     addToList(newRandom); 
    } 
} 

Однако, когда я пытаюсь использовать эти значения в моем главном классе GraphicGen, то currentActiveList возвращает нулевые значения для всех ее индексов.

public class GraphicGen extends JPanel { 
    ActiveList currentActiveList = new ActiveList(); 
    public static int gridSpaceX = 400; 
    public static int gridSpaceY = 400; 
    static JFrame mainFrame = new JFrame(); 

    protected void paintComponent(Graphics g) { 
     //super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     //int w = getWidth(); 
     //int h = getHeight(); 
     // Draw ordinate. 
     //g2.draw(new Line2D.Double(PAD, PAD, PAD, h-PAD)); 
     // Draw abcissa. 
     //g2.draw(new Line2D.Double(PAD, h-PAD, w-PAD, h-PAD)); 
     //double xInc = (double)(w - 2*PAD)/(data.length-1); 
     //double scale = (double)(h - 2*PAD)/maxValue(); 
     // Mark data points. 
     //g2.setPaint(Color.red); 

     double[] coords = new double[4]; 
     //g2.fill(new Ellipse2D.Double(coords[0], coords[1], 4, 4)); 
     //g2.fill(new Ellipse2D.Double(coords[2], coords[3], 4, 4)); 
     //g2.fill(new Ellipse2D.Double(100, 100, 4, 4)); 
     System.out.println("Graphic Gen Active List Obj: " +currentActiveList); 
     System.out.println("Ya drew a new Main GUI!"); 
     System.out.println("currentActiveList.getActiveList(): " +currentActiveList.getActiveList()); 
     for(int i = 0; i < currentActiveList.getLength(); i++) { 
      //System.out.println("currentActiveList.getFromList(i): "+currentActiveList.getFromList(i)); 
      //System.out.println("Graphic Gen Active List Obj: " +currentActiveList); 
      //System.out.println(activeList.getFromList(i).getTopLeftX()); 
      if(currentActiveList.getFromList(i) != null) { 
       coords[0] = currentActiveList.getFromList(i).getTopLeftX(); 
       System.out.println(coords[0]); 
       coords[1] = currentActiveList.getFromList(i).getTopLeftY(); 
       System.out.println(coords[1]); 
       coords[2] = currentActiveList.getFromList(i).getBottomRightX(); 
       System.out.println(coords[2]); 
       coords[3] = currentActiveList.getFromList(i).getBottomRightY(); 
       System.out.println(coords[3]); 
       g2.draw(new Line2D.Double(coords[0], coords[1], coords[2], coords[1])); 
       g2.draw(new Line2D.Double(coords[0], coords[1], coords[0], coords[3])); 
       g2.draw(new Line2D.Double(coords[2], coords[1], coords[2], coords[3])); 
       g2.draw(new Line2D.Double(coords[0], coords[3], coords[2], coords[3])); 
      } 
     } 

     /*double x = 50; 
     double y = 50; 
     g2.fill(new Ellipse2D.Double(x, y, 4, 4));*/ 
     /*for(int i = 0; i < data.length; i++) { 
      double x = PAD + i*xInc; 
      double y = h - PAD - scale*data[i]; 
      g2.fill(new Ellipse2D.Double(x-2, y-2, 4, 4)); 
     }*/ 
    } 

    /*private int maxValue() { 
     int max = data[0]; 
     for(int i = 0; i < data.length; i++) { 
      if(data[i] > max) 
       max = data[i]; 
     } 
     return max; 
    }*/ 

    public void callRepaintOnMain() { 
     mainFrame.repaint(); 
    } 

    public void callGenRandom() { 
     currentActiveList.genRandomRectangle(); 
    } 

    public static void main(String[] args) { 
     mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainFrame.add(new GraphicGen()); 
     mainFrame.setSize(gridSpaceX, gridSpaceY); 
     ButtonPrompt buttonPrompter = new ButtonPrompt(); 
     mainFrame.setLocation(200,200); 
     mainFrame.setVisible(true); 
    } 
} 

Метод случайного генератора вызывается слушателем действия.

public class ButtonPrompt extends GraphicGen { 

    ActionListener actionListenerRandom = new ActionListener() { 
     public void actionPerformed(ActionEvent actionEvent) { 
      //currentActiveList.genRandomRectangle(); 
      callGenRandom(); 
      callRepaintOnMain(); 
     } 
    }; 

    JButton randomBtn = new JButton("Add Random Rectangle");   
    JButton inputCoordinates = new JButton("Input Rectangle Coordinates"); 

    public ButtonPrompt() { 
     JFrame f = new JFrame("Add Rectangles"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     BoxLayout boxLayout = new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS); 
     f.setLayout(boxLayout); 

     randomBtn.addActionListener(actionListenerRandom); 

     f.setSize(200, 200); 
     f.setLocation(600, 200); 
     f.setVisible(true); 
     f.add(randomBtn); 
     f.add(inputCoordinates); 
     f.pack(); 
    } 
} 

Является ли это проблемой или ссылкой на проблему? Я действительно в недоумении.

+4

Можете ли вы также поместить основной класс (как он использует ActiveList)? Например, кто называет 'addToList'? – coolcfan

+0

Я обновил его, надеюсь, что делает его более понятным. – John

+0

Если в списке прямоугольников уже есть 10 элементов, что вы ожидаете от своего кода? – BatScream

ответ

1

здесь:

public static void main(String[] args) { 
    ... 
    mainFrame.add(new GraphicGen()); 
    ... 
    ButtonPrompt buttonPrompter = new ButtonPrompt(); 
} 

ButtonPromptрасширяетGraphicGen, которая является JPanel. В конструкторе ButtonPrompt вы создали JFrame и добавили два JButton s к нему.

Итак, когда ваше приложение запустится, на экране будет два JFrames, один из которых - mainFrame, который содержит GraphicGen, а другой - buttonPrompter, который содержит две кнопки.

При нажатии на кнопки, actionPerformed() называется, и это на самом деле называть callGenRandom() в buttonPrompter - если логика генерации случайных является правильным, сгенерированные Прямоугольники добавляются buttonPrompter. Но вы не добавили этого buttonPrompter в любой из JFrame, вы его не увидите.


Что вы можете:

ButtonPrompt не распространяется GraphicGen, вместо этого, дать ButtonPrompt ссылку из GraphicGen вы добавили к mainFrame.

public class ButtonPrompt extends GraphicGen { 
    JButton randomBtn = new JButton("Add Random Rectangle");   
    JButton inputCoordinates = new JButton("Input Rectangle Coordinates"); 
    final GraphicGen gg; 

    public ButtonPrompt(GraphicGen gg) { 
     this.gg = gg; 
     ...... 

     ActionListener actionListenerRandom = new ActionListener() { 
      public void actionPerformed(ActionEvent actionEvent) { 
       gg.callGenRandom(); 
       gg.callRepaintOnMain(); 
      } 
     }; 

     randomBtn.addActionListener(actionListenerRandom); 

     ...... 
    } 
} 

и в вашем main():

public static void main(String[] args) { 
    ... 
    GraphicGen gg = new GraphicGen(); 
    mainFrame.add(gg); 
    ... 
    ButtonPrompt buttonPrompter = new ButtonPrompt(gg); 
} 

Более того, код есть и другие проблемы.

Например, GraphicGen является JPanel, основным классом и имеет поле JFrame, который фактически содержит экземпляр GraphicGen при запуске приложения - это плохо выглядит. Я мало знаю о Swing ... Нужно ли называть содержащее JFramerepaint() вместо того, чтобы просто позвонить JPanelrepaint(), если он есть?

+0

Я хочу, чтобы у меня было два JFrames, но я хочу, чтобы buttonPrompt на втором JFrame вызывал перерисовку на основном JFrame, как я могу это сделать, не вызывая нажатия кнопки расширения GraphicGen? – John

+0

@ Джон вижу мое обновление. – coolcfan

+0

Это решило это чудесно. Большое спасибо. – John

1

Действительная проблема вполне ясна, но только прочитав первые два метода достаточно, чтобы найти то, что, я полагаю, это ошибка:

public ActiveList() { 
    for(int i = 0; i < activeList.length; i++) 
     activeList[i] = null; 
} 

код выше совершенно бесполезно. Значение по умолчанию для элемента массива объектов равно нулю. Таким образом, цикл присваивает null переменной, которая уже равна нулю.

public void addToList(Rectangle x) { 
    for(int i = 0; i < this.activeList.length; i++) { 
     if(this.activeList[i] == null) { 
      this.activeList[i] = x; 
      i = this.activeList.length+1; 
     } 

     else 
      this.activeList[activeList.length-1] = x; 
    } 
} 

Если ваш список содержит только нуль, прямоугольник будет сохранен с индексом 0, и цикл остановится. Для всех разумных вызовов этого метода цикл найдет, что элемент с индексом 0 не является нулевым и, таким образом, сохранит x в последнем индексе массива, а затем в первом ненулевом индексе.

Я не знаю точно, чего вы пытаетесь достичь, и какова фактическая проблема, но вам, вероятно, следует забыть о реализации собственного списка на основе массива и вместо этого использовать ArrayList.

+0

Я знаю, что конструктор по умолчанию для объекта ActiveList бесполезен, я пытался это сделать из отчаяния. Моя проблема заключается в том, что когда я вызываю genRandomRectangle() на currentActiveList, после того, как он закончил создание случайного прямоугольника, он назначает случайный прямоугольник активному списку текущего объекта с помощью addToList. Однако, когда я возвращаюсь в GraphicsGen, и если (currentActiveList.getFromList (i)! = Null) {выполняется, .getFromList (i) всегда будет возвращать null. – John

Смежные вопросы