2014-01-12 2 views
0

Я делаю Connect Four Game. Я создал массив размером 6 на 7 из JPanel объектов, которые будут содержать изображения пустых или полных (красных или синих) пространств, изображения действуют как сетка, чтобы сделать доску и переключаться с пустого на определенный цвет на игрока выбирая этот столбец (я еще не слишком хорош в Java, я решил не создавать движущиеся объекты). У меня проблема с заполнением сетки пустым пространством.Как добавить массив JPanel в JPanel с помощью GridLayout?

Я смущен тем, как это сделать, у меня есть панель; gridPanel, с 6 на 7 GridLayout, и у меня есть массив панелей, содержащих Images. Я хочу добавить массив 6 на 7, на панель с 6 на 7 gridLayout, это можно сделать?

У меня также возникли проблемы с созданием массива панели, я делаю это правильно (в методе: createGrid)?

Задача: Нет Изображения появляются на панели с помощью GridLayout.

Мой код выглядит следующим образом:

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

public class ConnectFour{ 
    static JButton colOne = new JButton("Drop"); 
    static JButton colTwo = new JButton("Drop"); 
    static JButton colThree = new JButton("Drop"); 
    static JButton colFour = new JButton("Drop"); 
    static JButton colFive = new JButton("Drop"); 
    static JButton colSix = new JButton("Drop"); 
    static JButton colSeven = new JButton("Drop"); 

    static JPanel[][] gridComponent = new JPanel[6][7]; 
    static JPanel gridPanel = new JPanel(); 

    static JPanel emptySlot = new JPanel(); 
    static JPanel redSlot = new JPanel(); 
    static JPanel blueSlot = new JPanel(); 

    public static void main(String[] args){ 

    JPanel mainPanel = new JPanel(); 
    JPanel buttonPanel = new JPanel(); 

    //Creation of the 3 possible slot images 
    ImageIcon emptyCircle = new ImageIcon("emptyCircle.png"); 
    ImageIcon redCircle = new ImageIcon("redCircle.png"); 
    ImageIcon blueCircle = new ImageIcon("blueCircle.png"); 
    JLabel emptyLabel = new JLabel(emptyCircle); 
    JLabel redLabel = new JLabel(redCircle); 
    JLabel blueLabel = new JLabel(blueCircle); 
    emptySlot.add(emptyLabel); 
    redSlot.add(redLabel); 
    blueSlot.add(blueLabel); 

    mainPanel.setLayout(new BorderLayout()); 
    gridPanel.setLayout(new GridLayout(6, 7)); 
    buttonPanel.setLayout(new GridLayout(1, 7)); 

    mainPanel.add(gridPanel, BorderLayout.CENTER); 
    mainPanel.add(buttonPanel, BorderLayout.NORTH); 

    buttonPanel.add(colOne); 
    buttonPanel.add(colTwo); 
    buttonPanel.add(colThree); 
    buttonPanel.add(colFour); 
    buttonPanel.add(colFive); 
    buttonPanel.add(colSix); 
    buttonPanel.add(colSeven); 

    //Properties of the JFrame 
    JFrame window = new JFrame("Connect Four"); //Title 
    window.setContentPane(mainPanel); //content pane set to mainPanel 
    window.setSize(500,500);   //JFrame size 
    window.setLocation(0,0);  //Location of appearance 
    window.setVisible(true);   //Set to be visable 
    window.setResizable(true);  //Set to be resizeable 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Program ends upon exiting window 

    createGrid(); 
    clearBoard(); 

    } 
    public static void createGrid(){ 

    for(int a=0; a<6; a++){ 
     for(int b=0; b<7; b++){ 
     gridComponent[a][b] = new JPanel(); 
     gridPanel.add(gridComponent[a][b]); 
     } 
    } 
    } 
    public static void clearBoard(){ 
    for(int a=0; a<6; a++){ 
     for(int b=0; b<7; b++){ 
     gridComponent[a][b] = emptySlot; 
     } 
    } 
    } 
} 
+2

Не уверен, что только дубликат, но [эта тема] (http://stackoverflow.com/questions/21070555/java-making-connect-four-game-panel) был опубликован просто Несколько минут назад. – PakkuDon

+2

Кажется, это другой парень с тем же домашним заданием;) По крайней мере, этот код решает проблему другой темы. –

+0

@OP: В чем проблема, которую вы сейчас публикуете? Вы не можете ожидать, что мы сканируем ваш код на возможные проблемы. Вы ошибаетесь? Или ошибка? –

ответ

2

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

public static void main (String[] args){ 
    ConnectFour connectFour = new ConnectFour(); 
} 

Во-вторых: Ваш метод clearBoard неверен. Вам нужно установить новую пустую строку для каждой панели. Поэтому вызовите конструктор JPanel и передайте EmptyCircle ImageIcon. Используйте этот объект в методе добавления gridComponent.

3

Вы еще не добавили мне этикеток gridCompoents. Вы хотите, чтобы добавить метку и иконку непосредственно к каждой одной

for(int a=0; a<6; a++){ 
    for(int b=0; b<7; b++){ 
    gridComponent[a][b] = new JPanel(); 
    gripComponent.add(new JLabel(emptyCirle)); <---- 
    gridPanel.add(gridComponent[a][b]); 
    } 
} 

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

Также у вас do необходимо узнать об использовании static. Вы без необходимости используете его. Вы можете просто создать все в конструкторе, а затем позвонить new ConnectFour() в main. Тогда вам не придется делать все методы static

+0

Нет необходимости в новом ImageIcon в каждой ячейке. Один экземпляр действительно может быть разделен. –

+0

ohhh! Спасибо я поняла!Я не работал с графикой через некоторое время ... – user2920781

+0

Пожалуйста, [принимайте] (http://meta.stackexchange.com/a/65088/155831) ответ, если он помог решить проблему. –

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