2016-04-29 6 views
0

Эта часть кода отлично работает, когда не используется массив или массивы.Когда я пытаюсь запустить свою программу, графический интерфейс не загружается, и я не могу понять, почему

import javax.swing.*; 
public class GUI 
{ 
    public static void main(String[] args) { 
     JFrame frame = new JFrame("01"); 
     frame.getContentPane().add(new Panel()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setVisible(true); 
    } 
} 

Эта часть кода работает отлично, если не используется массивы или ArrayLists

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

public class Panel extends JPanel 
{ 
    private Shapes shapes; 

    public Panel() { 
     setFocusable(true); 
     requestFocusInWindow(); 
     setPreferredSize(new Dimension(500,500)); 
    } 

    public void paintComponent(Graphics gc) { 
     super.paintComponent(gc); 
     shapes.draw(gc); 
    } 
} 

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

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

public class Shapes 
{ 

    ArrayList <int[]> blocks = new ArrayList <int[]>(); 

    int[] arr; 
    int w,x,y,z; 

    public void draw(Graphics gc) { 
     gc.setColor(Color.black); 
     blocks(); 
     for(int i=0; i<blocks.size()-1; i++){ 
      w=blocks.get(i)[0]; 
      x=blocks.get(i)[1]; 
      y=blocks.get(i)[2]; 
      z=blocks.get(i)[3]; 
      gc.fillRect(w, x, y, z); 
     } 
    } 

    public void blocks() { 
     popBlocks(100,500,300,30); 
     popBlocks(300,400,150,30); 
     popBlocks(500,300,150,30); 
     popBlocks(700,200,150,30); 
     popBlocks(900,100,150,30); 
    } 

    private void popBlocks(int a, int b, int c, int d) { 
     arr[0] = a; 
     arr[1] = b; 
     arr[2] = c; 
     arr[3] = d; 
     blocks.add(arr); 
    } 
} 
+1

Какие у вас проблемы/ошибки? Есть ли стек, который вы можете добавить в свой ответ? – MasterBlaster

+0

В очередях, что вы делаете, это «push». «pop» обычно _removes_ элемент из очереди. –

ответ

0
for(int i=0; i<blocks.size()-1; i++){ 

условие для цикла неправильно, что должно быть

for(int i=0; i<=blocks.size()-1; i++) . 
or 
for(int i=0; i<blocks.size(); i++) 

Вы могли бы хотеть попробовать это.

1

NullPointerException в Panel#paintComponent потому shapes не инициализирована ...

public class Panel extends JPanel { 

    private Shapes shapes; 

    public Panel() { 
     shapes = new Shapes(); 

NullPointerException в Shapes#popBlocks потому arr не инициализирован

public class Shapes 
{ 
    //...  
    int[] arr = new int[4]; 
    //... 

Но ждать, что только рисует одиночную фигуру ?! Все это делает обновляет экземпляр arr с некоторыми новыми значениями и добавить его в blocksList

private void popBlocks(int a, int b, int c, int d) { 
    arr[0] = a; 
    arr[1] = b; 
    arr[2] = c; 
    arr[3] = d; 
    blocks.add(arr); 
} 

Это означает, что у вас есть 5 блоков с значениями 900,100,150,30.

Вместо использования поля экземпляра, вы должны сделать arr полевой уровень метода, например ...

public class Shapes 
{ 
    //...  
    //int[] arr; 
    //... 

    private void popBlocks(int a, int b, int c, int d) { 
     int[] arr = new int[4]; 
     arr[0] = a; 
     arr[1] = b; 
     arr[2] = c; 
     arr[3] = d; 
     blocks.add(arr); 
    } 
} 

Также for-loop в методе draw неправильно, он должен быть зацикливанием из 0-size - 1, не 0-size - 2, например

public void draw(Graphics gc) { 
    //... 
    for(int i=0; i < blocks.size(); i++){ 
     //... 
+0

'arr' - это переменная уровня класса, поэтому они не получат NPE. Они все равно не получат то, что хотят, хотя ... –

+0

@ Clockwork-Muse Я не мог видеть, где-либо объявлялся 'arr', поэтому он должен быть« null », удалив переменную уровня класса и сделав ее методом (и инициализируя его), OP должен теперь получить 5 форм, которые они определили ... Я не могу проверить код, поэтому я полагаюсь на свои «потрясающие» навыки проверки стола – MadProgrammer

+0

@ Clockwork-Muse * «Я не мог видеть, где был объявлен arr» * - извините, инициализировано: P – MadProgrammer

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