1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
public class GridHexagons extends JPanel {
private final Polygon hexagon = new Polygon();
private final BasicStroke bs1 = new BasicStroke(1);
private final BasicStroke bs3 = new BasicStroke(3);
private final Point focusedHexagonLocation = new Point();
private final Dimension dimension;
private final int rows, columns, side;
private Point mousePosition;
private int number;
private final Image image1, image2;
public GridHexagons(final int rows, final int columns, final int side) {
this.rows = rows;
this.columns = columns;
this.side = side;
dimension = getHexagon(0, 0).getBounds().getSize();
MouseInputAdapter mouseHandler = new MouseInputAdapter() {
@Override
public void mouseMoved(final MouseEvent e) {
mousePosition = e.getPoint();
repaint();
}
@Override
public void mousePressed(final MouseEvent e) {
if (number != -1) {
System.out.println("Hexagon " + (number + 1));
}
}
};
addMouseMotionListener(mouseHandler);
addMouseListener(mouseHandler);
image1 = getTestImage(Color.ORANGE);
image2 = getTestImage(Color.LIGHT_GRAY);
}
@Override
public void paintComponent(final Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(Color.black);
g2d.setStroke(bs1);
number = -1;
for (int row = 0; row < rows; row += 2) {
for (int column = 0; column < columns; column++) {
getHexagon(column * dimension.width,
(int) (row * side * 1.5));
if (mousePosition !=null && hexagon.contains(mousePosition)){
focusedHexagonLocation.x = column * dimension.width;
focusedHexagonLocation.y = (int) (row * side * 1.5);
number = row * columns + column;
}
g2d.draw(hexagon);
g2d.drawImage(image1,(int)(hexagon.getBounds().x + side*0.5),
(int) (hexagon.getBounds().y + side * 0.5), this);
}
}
for (int row = 1; row < rows; row += 2) {
for (int column = 0; column < columns; column++) {
getHexagon(column * dimension.width + dimension.width / 2,
(int) (row * side * 1.5 + 0.5));
if (mousePosition!= null && hexagon.contains(mousePosition)){
focusedHexagonLocation.x = column * dimension.width
+ dimension.width / 2;
focusedHexagonLocation.y =(int) (row * side * 1.5 + 0.5);
number = row * columns + column;
}
g2d.draw(hexagon);
g2d.drawImage(image2,(int)(hexagon.getBounds().x + side*0.5),
(int) (hexagon.getBounds().y + side * 0.5), this);
}
}
if (number != -1) {
g2d.setColor(Color.red);
g2d.setStroke(bs3);
Polygon focusedHexagon = getHexagon(focusedHexagonLocation.x,
focusedHexagonLocation.y);
g2d.draw(focusedHexagon);
}
}
public Polygon getHexagon(final int x, final int y) {
hexagon.reset();
int h = side / 2;
int w = (int) (side * (Math.sqrt(3) / 2));
hexagon.addPoint(x, y + h);
hexagon.addPoint(x + w, y);
hexagon.addPoint(x + 2 * w, y + h);
hexagon.addPoint(x + 2 * w, y + (int) (1.5 * side));
hexagon.addPoint(x + w, y + 2 * side);
hexagon.addPoint(x, y + (int) (1.5 * side));
return hexagon;
}
public static void main(final String[] args) {
Runnable gui = new Runnable() {
public void run() {
JFrame f = new JFrame("GridHexagons");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new GridHexagons(8, 8, 40));
f.setSize(600, 600);
f.setVisible(true);
}
};
//GUI must start on EventDispatchThread:
SwingUtilities.invokeLater(gui);
}
private Image getTestImage(final Color color1) {
BufferedImage img = new BufferedImage(side, side,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) img.getGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setColor(getBackground());
g2d.fillRect(0, 0, side, side);
g2d.setColor(color1);
g2d.fillOval(0, 0, side - 9, side - 3);
g2d.drawOval(0, 0, side - 9, side - 3);
g2d.setColor(Color.WHITE);
g2d.fillOval(4, 9, 5, 7);
g2d.setColor(color1);
g2d.drawOval(4, 9, 5, 7);
g2d.fillOval(6, 12, 3, 3);
g2d.setColor(Color.WHITE);
g2d.fillOval(14, 9, 5, 7);
g2d.setColor(color1);
g2d.drawOval(14, 9, 5, 7);
g2d.fillOval(16, 12, 3, 3);
g2d.setColor(Color.RED);
g2d.fillOval(8, 20, 6, 3);
g2d.setColor(color1);
g2d.drawOval(8, 20, 6, 3);
return img;
}
} |
Partager