Я немного новичок в качелях. Чтобы научиться правильно использовать 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?
Благодаря
У меня есть проблема с GridBagLayout в том, что там, кажется, нет способа сделать сетку статическим размером - то есть, как я могу сделать так, чтобы она всегда была сеткой размером 5 х 4, и сетка не добавляет или не удаляет столбцы, когда я применяю движения к доске. Кроме того, когда я запускаю код, он показывает только верхний левый угол.Например, центральный блок должен охватывать 2 столбца и 2 строки, а верхний левый угол блока должен находиться в первом столбце/первом столбце. Он показывает только 1 х 1 компонент, занимающих первую строку/первый столбец. – newalchemy