2016-07-16 7 views
2

Цель состоит в том, чтобы отобразить таблицу ячеек, где все клетки являются независимыми друг от друга, и каждая ячейка имеет несколько дополнительных дисплеев (представьте себе доску Kakuro, Jeopardy доска, внутр.)Схема сетки, содержащая макеты карт - это можно сделать?

Это моя первая попытка на качелях , После большого чтения я решил, что мой подход будет заключаться в том, чтобы сначала спроектировать каждую ячейку независимо друг от друга с помощью макета карты (эта часть, которую я доволен), а затем «обернуть» ее в макет сетки. Это, вероятно, где мое отсутствие понимания в основном свинге поднимает голова:

При проектировании каждой ячейки я создаю рамку и добавить панель к нему:

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

    public class Cell extends Component{ 

    JFrame frame = new JFrame(); 

    /* we'll use a card layout with a panel for each look of the cell */ 
    CardLayout cardLayout = new CardLayout(); 
    JPanel containterPanel = new JPanel(); 
    JPanel firstPanel = new JPanel(); 
    JPanel secondPanel = new JPanel(); 
    JPanel thridpanel = new JPanel(); 

    public Cell(){ 

     /* assign the card layout to the container panel */ 
     containterPanel.setLayout(cardLayout); 

     /* assign objects to the different panels - details not important for the sake of the question */ 
     //.... 

     /* add the different panels to the container panel and show the initial one */ 
     containterPanel.add(firstPanel, "firstPanel"); 
     containterPanel.add(secondPanel, "secondPanel"); 
     containterPanel.add(thridpanel, "thridpanel"); 
     cardLayout.show(containterPanel, "firstPanel"); 

     /* add the container to the frame and display it*/ 
     frame.add(containterPanel); 
     frame.setVisible(true); 
    } 
} 

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

import java.awt.*; 


public class Board{ 

    private static final int COLUMNS_NUM = 3; 
    private static final int ROWS_NUM = 3; 

    JFrame frame = new JFrame(); 
    JPanel panel = new JPanel(); 
    Cell cells[] = new Cell[COLUMNS_NUM * ROWS_NUM]; 

    public Board(){ 

     panel.setLayout(new GridLayout(ROWS_NUM, COLUMNS_NUM)); 
     for (int i = 0; i <ROWS_NUM * COLUMNS_NUM; i++) 
     { 
      cells[i] = new Cell(); 
      panel.add(cells[i]); 
     } 

     frame.add(panel); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Board(); 
    } 

} 

Что я получаю кучу несвязанных кадров, отделенную от основного каркаса платы. Я не правильно обрабатываю фреймы (должен ли я создать только один ...?). Любая помощь в руководстве меня к правильному подходу будет оценена по достоинству.

+0

1) * "макет сетки макеты, содержащие карты - может это быть готовым? »* Да. 2) Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

Спасибо @AndrewThompson, относительно новое здесь - я сделал небольшие изменения, я считаю, что теперь он требует требования «Минимальное, полное и проверяемое». Пожалуйста, дайте мне знать, если это не так. – yonikes

+0

Если ячейки должны быть добавлены в Board, сделайте их JPanel, а не JFrame – c0der

ответ

1

Если клетки должны быть добавлены в состав Совета, сделать их JPanel, а не JFrame


Пример:

импорт java.awt.CardLayout; импорт javax.swing.JLabel; импорт javax.swing.JPanel;

//make it a sub class of JPanel for easier implementation. 
public class Cell extends JPanel{ 

    public Cell(){ 

     JPanel firstPanel = new JPanel(); 
     //add a lable just so something is displayed 
     firstPanel.add(new JLabel(("Panel 1"))); 
     JPanel secondPanel = new JPanel(); 
     JPanel thridpanel = new JPanel(); 

     CardLayout cardLayout = new CardLayout(); 
     /* assign the card layout */ 
     setLayout(cardLayout); 

     /* add the different panels to the container panel and show the initial one */ 
     add(firstPanel, "firstPanel"); 
     add(secondPanel, "secondPanel"); 
     add(thridpanel, "thridpanel"); 
     cardLayout.show(this, "firstPanel"); 
    } 
} 

И совет держать клетки:

import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 


//make it a sub class of JFrame for easier implementation. 
public class Board extends JFrame{ 

    private static final int COLUMNS_NUM = 3; 
    private static final int ROWS_NUM = 3; 

    Cell cells[] = new Cell[COLUMNS_NUM * ROWS_NUM]; 

    public Board(){ 

     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setPreferredSize(new Dimension(800, 800)); 

     JPanel panel = new JPanel(); 
     add(panel); //or better getContentPane().add(panel); 
     panel.setLayout(new GridLayout(ROWS_NUM, COLUMNS_NUM)); 

     for (int i = 0; i <(ROWS_NUM * COLUMNS_NUM); i++) 
     { 
      cells[i] = new Cell(); 
      panel.add(cells[i]); 
     } 

     pack(); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     new Board(); 
    } 
} 

Вот как это выглядит:

enter image description here

+0

Спасибо, что привело меня в сторону. По вашему предложению, макет карты содержит три панели без родительского контейнера. Если я правильно понимаю, наличие такой панели контейнера - правильный способ поддержки переходов между картами. Итак, я сделал это: panel.add (ячейки [i] .containterPanel); вместо этого: panel.add (ячейки [i]); Это все, что нужно - добавление панели контейнера, а не самой ячейки (которая в моей версии не расширяет Jpanel). – yonikes

+0

Я рад, что это помогло. Вверх проголосовал за вопрос, потому что он был хорошо сформирован. – c0der