2014-01-20 6 views
0

Я немного новичок в качелях. Чтобы научиться правильно использовать API, я проектирую следующий проект: Проект - решающая головоломка-головоломка-головоломка, головоломка, подобная головоломкам с часовыми часами, распространенными в магазинах игрушек - https://en.wikipedia.org/wiki/Rush_Hour_(board_game), за исключением того, что нет выхода для специального автомобиль.Сетка гридов или схема сетки?

Перетаскивая блоки с доски на доску, пользователь указывает начальную конфигурацию головоломки. Аналогичным образом пользователь определяет конфигурацию конечной цели, которая определяет, где некоторые (или все) блоки, которые пользователь указал первоначально, должны быть в конце головоломки - конечная конфигурация может быть указана только с использованием НЕКОТОРЫХ блоков, делая несколько законных окончательных конфигураций.

Алгоритм решения головоломки уже завершен - мне просто нужно спроектировать интерфейс, и я застреваю. Для проектирования лотка я использовал макет сетки. Поскольку блоки необходимо вводить в определенные позиции, мне нужно иметь возможность размещать блоки в определенных ячейках сетки и перемещать их.

Объект «блок» имеет четыре атрибута: его высоту, ширину, верхнюю строку и левый верхний столбец (т. Е. Каждый блок адресуется в верхнем левом углу).

Я использовал предложение здесь (https://stackoverflow.com/questions/2510159/can-i-add-a-component-to-a-specific-grid-cell-when-a-gridlayout-is-used) для макета сетки.

Прямо сейчас я запрограммирован только на точку, где java читает головоломку из TXT-файла и должен отображать ее на экране (я еще не разработал какую-либо пользовательскую интерактивность).

Во-первых, вот код, который я написал до сих пор.

public class SolverPuzzleGUI extends JFrame { 

//Specs from the puzzle. 
Board initBoard; 
ArrayList<Block> goalBlocks; 
LinkedList<Move> moveList; 

JLayeredPane layeredpane; 
JPanel Board; 
Dimension boardsize = new Dimension(400, 500); 
JPanel[][] panelHolder = new JPanel[5][4]; 

public SolverPuzzleGUI(Board startBoard, ArrayList<Block> startGoalBlocks, 
     LinkedList<Move> startMoveList) { 
    this.initBoard = startBoard; 
    this.goalBlocks = startGoalBlocks; 
    this.moveList = startMoveList; 


} // end constructor. 


//gives the actual simulation 

public void runSimulation() { 



    // Initalizing the main window. 
    setSize(500, 600); 
    setName("Solution"); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setMinimumSize(getMinimumSize()); 



    //Using layered pane 
    layeredpane = new JLayeredPane(); 
    add(layeredpane); 
    layeredpane.setPreferredSize(boardsize); 

    layeredpane.setBackground(Color.YELLOW); 
    layeredpane.setVisible(true); 



    // adding the game tray 
    Board = new JPanel(); 
    layeredpane.add(Board, JLayeredPane.DEFAULT_LAYER); 
    Board.setLayout(new GridLayout(5, 4)); 

    // centering the game tray. 
    Board.setPreferredSize(boardsize); 
    Board.setMinimumSize(boardsize); 
    Board.setMaximumSize(boardsize); 

    Box box = new Box(BoxLayout.Y_AXIS); 
    box.add(Box.createVerticalGlue()); 
    box.add(Board); 
    box.add(Box.createVerticalGlue()); 

    add(box); 


    //Adding placeholders to the board for creating blocks 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < 4; j++) { 
      panelHolder[i][j] = new JPanel(); 
      panelHolder[i][j].setBackground(Color.DARK_GRAY); 

      Board.add(panelHolder[i][j]); 
      layeredpane.setLayer(panelHolder[i][j], JLayeredPane.DEFAULT_LAYER); 
      panelHolder[i][j].setVisible(false); 


     } // end 'j' for 
    } // end 'i' for 

    ArrayList<Block> initBlocks = initBoard.getBlocks(); 
    //int count = 0; //DEBUG 
    for (Block block : initBlocks) { 
     this.drawBlock(block); 
     //count++; 
     //if(count > 4) { break; } 
       } // end 'for' 


    Board.setBackground(Color.DARK_GRAY); 
    Board.setVisible(true); 

    setVisible(true); 
} // end 'run' 



private void drawBlock(Block block) { 
    Dimension blockSize = new Dimension(block.getWidth()*100, block.getHeight()*100); 
    System.out.println(blockSize.width); 
    System.out.println(blockSize.height); 

    JPanel screenBlock = new JPanel(); 

    screenBlock.setPreferredSize(blockSize); 
    screenBlock.setMinimumSize(blockSize); 
    screenBlock.setMaximumSize(blockSize); 
    screenBlock.setSize(blockSize); 

    screenBlock.setBackground(Color.BLUE); 
    screenBlock.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
    layeredpane.setLayer(screenBlock, JLayeredPane.MODAL_LAYER); 

    int leftRow = block.getRow(); 
    int leftCol = block.getColumn(); 


    panelHolder[leftRow][leftCol].setSize(blockSize); 
    panelHolder[leftRow][leftCol].setVisible(true); 
    panelHolder[leftRow][leftCol].add(screenBlock); 
    layeredpane.setLayer(panelHolder[leftRow][leftCol], JLayeredPane.MODAL_LAYER); 


    screenBlock.setVisible(true); 



}// end 'drawBlock' 






public static void main(String[] args) { 
    String file = "C:\\Users\\Tim\\Desktop\\init.from.handout.txt"; 
    String goal = "C:\\Users\\Tim\\Desktop\\goal.2.from.handout.txt"; 

    /* 
    A SolverPuzzle object is the object which actually solves the algorithm - 
    when the class is constructed, it takes the file path of the inital 
    configuration as an input, as well as the file path of the goal 
    configuration. It has the following fields: 

    A 'board' object which specifies the inital configuration of the board. 
    It contains an ArrayList of Block objects(Remember block objects store 
    the height and width of the block, as well as the address of the 
    top left corner of block) which specify the starting 
    blocks, an ArrayList of EmptySpace objects which specify the empty 
    spaces on the board, an ArrayList of Move objects, which contain 
    the legal moves of the configuration, and the height and width of 
    the tray (in this application, the tray will always be 5 x 4). 

    An ArrayList of Block objects which specify the ending configuration. 

    A LinkedList of Move objects which specify the shortest possible 
    list of Moves which brings the configuration to a position which 
    satisfies the goal position. A Move object has three fields - 
    The block object being moved, and the row and column of the 
    top left corner of the block in the new position. 


    */ 

    SolverPuzzle test; 
    try { test = new SolverPuzzle(file, goal); } 
    catch (IOException ex) { 
     System.out.println("IOException"); 
     return; 
    } 
    Board testBoard = test.getStartBoard(); 

    ArrayList<Block> testGoalBlocks = test.getGoalBlocks(); 
    LinkedList<Move> testMoveSolution = test.getMoveList(); 

    // testing the gui 
    SolverPuzzleGUI testGUI = new SolverPuzzleGUI(testBoard, testGoalBlocks, 
           testMoveSolution); 
    testGUI.runSimulation(); 

} 

} // end class 'SolverPuzzleGUI' 

Вот токовый выход и желаемый выход.

http://imgur.com/a/ykXXP

Так точно, у меня есть два вопроса:

1 - Почему изображение показывает только верхние левые углы блоков вместо целого блока?

2 - Лучше ли продолжать использовать GridLayout или переключиться на GridBagLayout?

Благодаря

ответ

1

GridBagLayout определенно был бы подходящим для хотим, чтобы вы хотите сделать. Например, вы можете развернуть компоненты, чтобы охватить более одного столбца или строки - точно так же, как вы хотите. Обратитесь к java tutorials за то, как их использовать.

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

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

+0

У меня есть проблема с GridBagLayout в том, что там, кажется, нет способа сделать сетку статическим размером - то есть, как я могу сделать так, чтобы она всегда была сеткой размером 5 х 4, и сетка не добавляет или не удаляет столбцы, когда я применяю движения к доске. Кроме того, когда я запускаю код, он показывает только верхний левый угол.Например, центральный блок должен охватывать 2 столбца и 2 строки, а верхний левый угол блока должен находиться в первом столбце/первом столбце. Он показывает только 1 х 1 компонент, занимающих первую строку/первый столбец. – newalchemy

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