private void checkButton(ActionEvent e) { int lidx = 0; for (MyButton button : buttons) { if (button.isLastButton()) { lidx = buttons.indexOf(button); } } JButton button = (JButton) e.getSource(); int bidx = buttons.indexOf(button); if ((bidx - 1 == lidx) || (bidx + 1 == lidx) || (bidx - 3 == lidx) || (bidx + 3 == lidx)) { Collections.swap(buttons, bidx, lidx); updateButtons(); } }
private void initUI() { solution.add(new Point(0, 0)); solution.add(new Point(0, 1)); solution.add(new Point(0, 2)); solution.add(new Point(1, 0)); solution.add(new Point(1, 1)); solution.add(new Point(1, 2)); solution.add(new Point(2, 0)); solution.add(new Point(2, 1)); solution.add(new Point(2, 2)); solution.add(new Point(3, 0)); solution.add(new Point(3, 1)); solution.add(new Point(3, 2)); buttons = new ArrayList<>(); panel = new JPanel(); panel.setBorder(BorderFactory.createLineBorder(Color.gray)); panel.setLayout(new GridLayout(4, 3, 0, 0)); try { source = loadImage(); int h = getNewHeight(source.getWidth(), source.getHeight()); resized = resizeImage(source, DESIRED_WIDTH, h, BufferedImage.TYPE_INT_ARGB); } catch (IOException ex) { Logger.getLogger(PuzzleSample.class.getName()).log(Level.SEVERE, null, ex); } width = resized.getWidth(null); height = resized.getHeight(null); add(panel, BorderLayout.CENTER); for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { image = createImage( new FilteredImageSource( resized.getSource(), new CropImageFilter(j * width / 3, i * height / 4, (width / 3), height / 4))); MyButton button = new MyButton(image); button.putClientProperty("position", new Point(i, j)); if (i == 3 && j == 2) { lastButton = new MyButton(); lastButton.setBorderPainted(false); lastButton.setContentAreaFilled(false); lastButton.setLastButton(); lastButton.putClientProperty("position", new Point(i, j)); } else { buttons.add(button); } } } Collections.shuffle(buttons); buttons.add(lastButton); for (int i = 0; i < 12; i++) { MyButton btn = buttons.get(i); panel.add(btn); btn.setBorder(BorderFactory.createLineBorder(Color.gray)); btn.addActionListener(new ClickAction()); } pack(); setTitle("Puzzle"); setResizable(false); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }