For creating the tiles, I would use gc.fillPolygon() if a canvas is being used, or a 6-sided polygon object as Matteo put if a grid is being used.
When making a grid out of hexagons, there will be two 'types' of rows. This is simply because of the way the math works out with the hexagons. One offset to the left, and another offset to the right, for an example to help imagine this I would look at floor tiles
https://www.tilesdirect.net/vintage-hex-1-black-white/
So now that you have the two rows you can just offset the one row by whatever X value and then the tiles should fit nicely into the gaps created by the first row, then just alternate the types of rows. We haven't implemented this feature yet, but this is how I imagine would be the easiest way to do it.