2015-12-15 4 views
1

У меня есть двумерный массив JButton, и я хочу добавить к каждой кнопке другое изображение. Эти изображения называются 1.jpg, 2.jpg ...Добавление изображений в 2D массив JButton

В общей сложности 27 кнопок (сетка 3x9), поэтому установка их вручную будет утомительной. Я попробовал его с массивом ImageIcon и for-loops, но он не работает. Кто-нибудь понял, что случилось с моим кодом?

void createButtons() { 
     JButton[][] buttons = new JButton[3][9]; 
     for (int i = 0; i < buttons.length; i++) { 
      for (int j = 0; j < buttons[i].length; j++) { 
       buttons[i][j] = new JButton(); 
       buttons[i][j].setIcon(addImages()); 
      } 
     } 
    } 

ImageIcon addImages() { 

    ImageIcon[] images = new ImageIcon[27]; 
    for (int i = 0; i < images.length; i++) { 
     images[i] = new ImageIcon(i + ".jpg"); 
     return images[i]; 
    } 
+0

Почему вы используете для цикла в addImages()? Он заканчивается на первой итерации, потому что вы возвращаете значение там. – PcAF

ответ

0

Ваш метод addImages всегда будет возвращать новый значок изображения с 0.jpg.

Вы можете сделать это вместо того, чтобы:

void createButtons() { 
     JButton[][] buttons = new JButton[3][9]; 
     int index = 1; //start from 1.jpg 
     for (int i = 0; i < buttons.length; i++) { 
      for (int j = 0; j < buttons[i].length; j++) { 
       buttons[i][j] = new JButton(); 
       buttons[i][j].setIcon(new ImageIcon((index++) + ".jpg")); 
      } 
     } 
    } 
+0

@TomCollins Попробуйте и дайте мне знать результат. – user3437460

+0

@TomCollins Если это не сработает, тогда некоторые другие части ваших кодов могут вызвать его. мы должны будем увидеть все коды .. – user3437460

+0

Спасибо, теперь это работает! –

0

Вы смешиваете метод, который следует использовать раз, чтобы сделать все изображения другим способом, чтобы принести один изображения вам нужно. Попробуйте это:

ImageIcon[] addImages() { 
    ImageIcon[] images = new ImageIcon[27]; 
    for (int i = 0; i < images.length; i++) { 
     images[i] = new ImageIcon(i + ".jpg"); 
    } 
    return images; 
} 

Тогда вы можете вызвать addImages() и ссылки на массив:

void createButtons() { 
     ImageIcon[] images = addImages(); // called once here 
     JButton[][] buttons = new JButton[3][9]; 
     for (int i = 0; i < buttons.length; i++) { 
      for (int j = 0; j < buttons[i].length; j++) { 
       buttons[i][j] = new JButton(); 
       buttons[i][j].setIcon(images[i * buttons[i].length + j]); // then use it here 
      } 
     } 
    } 
+0

Спасибо, это сработало хорошо. Другие сказали, что я должен сделать все одним способом, поэтому я их совмещу. Но я узнал, какова была моя ошибка, спасибо. –

0

Вы можете установить изображение непосредственно в цикле:

void createButtons() { 
    JButton[][] buttons = new JButton[3][9]; 
    for (int i = 0; i < buttons.length; i++) { 
     for (int j = 0; j < buttons[i].length; j++) { 
      buttons[i][j] = new JButton(); 
      buttons[i][j].setIcon(new ImageIcon((i * 9 + j) + ".jpg")); 
     } 
    } 
} 

Там не нужно для весь метод для этого (более того, он написан неправильно).

Edit: проблема с addImages()

Ваш метод addImages() повторяется в течение, каждый раз, когда он создает новый ImageIcon[], который, если вообще, должны быть созданы только один раз (за пределами любого цикла). Внутри вы начинаете итерирование по массиву, но останавливаетесь на первой итерации, i=0, потому что ваш return images[0]. Этот метод всегда будет возвращать одно и то же значение.

+0

Спасибо, первая кнопка пуста, но остальные появляются (я думаю, это потому, что i = 0 на первой итерации?). Можете ли вы объяснить, что не так с моим методом (помимо излишней)? Я все еще новичок в Java. –

+0

@TomCollins "* первая кнопка пуста *" Это связано с именами файлов, которые я не могу знать. Если вы правильно их пронумеровали, просто настройте индекс для соответствия. Я отредактировал свой вопрос, чтобы объяснить, что не так с вашим методом. – user1803551

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