Как сделать гексагональные кнопки J

Я написал короткую игру. В существующей реализации у меня есть GridBagLayout с кнопками, расположенными в виде шахматной доски. Каждая кнопка занимает всю сетку. Игра работает нормально. Моя следующая задача - изменить доску, чтобы она состояла из шестиугольных кнопок, а не из прямоугольников, как сейчас. Совершенно не знаю, как это сделать. Кнопки на картинке должны выглядеть так:  target


person SigGP    schedule 16.05.2017    source источник
comment
Это не шестигранники.   -  person Dawood ibn Kareem    schedule 17.05.2017
comment
На самом деле, есть много сообщений о форме JButtons, однако я не хотел рыться в них, чтобы найти ответ. Это может помочь   -  person    schedule 17.05.2017
comment
Возможный дубликат кнопок другой формы, кроме прямоугольников   -  person    schedule 17.05.2017
comment
У вас есть две проблемы: первая - это создание формы и то, как вы можете это сделать, вторая - получение выравнивания. Даже если вы используете JButton и сами раскрашиваете форму, используйте Border или Image, это все равно прямоугольник, поэтому почти все менеджеры по компоновке не будут размещать их так, как вы хотите. Либо для этого потребуется полный настраиваемый маршрут рисования, либо также потребуется настраиваемый менеджер компоновки.   -  person MadProgrammer    schedule 17.05.2017
comment
См. Также создание 10.000 связанных шестиугольных страниц; используйте Polygon::contains для проверки попадания ..   -  person trashgod    schedule 17.05.2017
comment
Не могли бы вы опубликовать свой код? Тогда я посмотрю, что я могу сделать.   -  person    schedule 28.07.2017


Ответы (1)


Это не самый красивый способ, но он, по крайней мере, даст вам идею:

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

public class HexagonPattern extends JPanel {
    private static final long serialVersionUID = 1L;
    private static final int ROWS = 7;
    private static final int COLUMNS = 7;
    private HexagonButton[][] hexButton = new HexagonButton[ROWS][COLUMNS];


    public HexagonPattern() {
        setLayout(null);
        initGUI();
    }


    public void initGUI() {
        int offsetX = -10;
        int offsetY = 0;

        for(int row = 0; row < ROWS; row++) {
            for(int col = 0; col < COLUMNS; col++){
                hexButton[row][col] = new HexagonButton(row, col);
                hexButton[row][col].addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        HexagonButton clickedButton = (HexagonButton) e.getSource();
                        System.out.println("Button clicked: [" + clickedButton.getRow() + "][" + clickedButton.getCol() + "]");
                    }
                });
                add(hexButton[row][col]);
                hexButton[row][col].setBounds(offsetY, offsetX, 105, 95);
                offsetX += 87;
            }
            if(row%2 == 0) {
                offsetX = -52;
            } else {
                offsetX = -10;
            }
            offsetY += 76;
        }
    }

    public static void main(String[] args) {
        HexagonPattern hexPattern = new HexagonPattern();
        JFrame frame = new JFrame();
        frame.setTitle("Hexagon Pattern");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(new Point(700, 300));
        frame.add(hexPattern);
        frame.setSize(550, 525);
        frame.setResizable(false);
        frame.setVisible(true);
    }

    //Following class draws the Buttons
    class HexagonButton extends JButton {
        private static final long serialVersionUID = 1L;
        private static final int SIDES = 6;
        private static final int SIDE_LENGTH = 50;
        public static final int LENGTH = 95;
        public static final int WIDTH = 105;
        private int row = 0;
        private int col = 0;

        public HexagonButton(int row, int col) {
            setContentAreaFilled(false);
            setFocusPainted(true);
            setBorderPainted(false);
            setPreferredSize(new Dimension(WIDTH, LENGTH));
            this.row = row;
            this.col = col;
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Polygon hex = new Polygon();
            for (int i = 0; i < SIDES; i++) {
                hex.addPoint((int) (50 + SIDE_LENGTH * Math.cos(i * 2 * Math.PI / SIDES)), //calculation for side
                        (int) (50 + SIDE_LENGTH * Math.sin(i * 2 * Math.PI / SIDES)));   //calculation for side
            }       
            g.drawPolygon(hex);
        }

        public int getRow() {
            return row;
        }

        public int getCol() {
            return col;
        }
    }
}

Проверьте это!

Эта программа состоит из 2 занятий:

  1. HexagonButton, который использует графику для рисования шестиугольника в JButton. Он также возвращает значения строки и столбца при вызове getRow или getCol.

  2. HexagonPattern, который является основным классом. Он создает узор, раскладывая их с помощью setBounds(x, y, width, height). Он использует ActionListener для печати координат шестиугольника, по которому щелкнули мышью, вызывая getRow и getCol.

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

person Community    schedule 28.07.2017