2016-11-23 7 views
2

Désolé, un débutant complet à Java. J'ai déjà fait une grille carrée, pour un jeu de dames, mais j'ai des problèmes avec une grille hexagonale. J'ai suivi la même idée avec la grille carrée, j'ai de petits points sur mon JPanel, bien que je ne sois pas sûr de la raison de cela, j'ai regardé autour de moi et j'ai essayé de voir ce qui pouvait être faux.JPanel n'affiche pas les composants? (Hexagon Grid)

GameBoard.java; responsable de l'élaboration hexagones

import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.Point; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.util.Collections; 

import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

//import CheckerBoard.GameSquareMouseListener; 


public class GameBoard extends JPanel { 
    protected final static int size = 8; 
    protected final static int radius = 50; 
    protected final static int padding = 5; 
    private Position oldPosition = null; 


    public GameBoard(){ 
     super(); 
     int numPieceSpots = 0; 
     int x = 0; int y = 0; 
     int xOff = (int) Math.cos(Math.toRadians(30)) * (radius + padding); 
     int yOff = (int) Math.sin(Math.toRadians(30)) * (radius + padding); 
     int half = size/2; 
     GameHexagon hex = null; 

     for (int r = 0; r < size; r++){ 
      for (int c = 0; c < size; c++) 
      { 
       if (((r + c) % 2 == 0) && (r % 2 == 1)){ 
        hex = new GameHexagon(r, c, x, y); 
       } 
       else if (((r + c) % 2 == 0) && (r % 2 == 0)) 
       { 
        hex = new GameHexagon(r, c, x, y); 
       } 
       else { 
        hex = new GameHexagon(r, c, x, y); 
       } 
       if (c == (size - 1)){ 
        x = 0; 
        y += yOff; 
       } 
       add (hex); 
       x += xOff*c; 
      } 
     } 
     repaint(); 
    } 
} 

GameHexagon.java; les éléments hexagonaux à tirer sur la carte

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Polygon; 
import java.awt.geom.Rectangle2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JComponent; 

public class GameHexagon extends JComponent 
{ 
    private int x; 
    private int y; 

    private Position pos = null; 

    //private GamePiece piece = null; 

    public GameHexagon (int row, int col, int xp, int yp) 
    { 
     super(); 

     pos = new Position (row, col); 
     x = xp; 
     y = yp; 
    } 

    public void paintComponent (Graphics g) 
    { 
     super.paintComponents (g); 

     Graphics2D g2 = (Graphics2D) g; 

     int height = getHeight(); 
     int width = getWidth(); 

     //Rectangle2D.Double bkgnd = new Rectangle2D.Double (x, y, width, height); 
     Hexagon bkgnd = new Hexagon(x, y, pos.r, pos.c, 50); 
     bkgnd.draw(g2, x, y, 2, true); 

     g.setColor(new Color(0xFFFFFF)); 
     g.drawString("TEST", x - 25, y + 25); 

    } 
} 

Hexagon.java; responsable de dessiner les hexagones Ce code que j'ai reçu d'un programmeur sur stackoverflow avec des modifications mineures, et je l'ai essayé moi-même et cela a fonctionné, cependant, je l'ai parcouru et je ne sais pas ce qui ne va pas. Faire.

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class Hexagon extends Polygon { 

    private static final long serialVersionUID = 1L; 

    public static final int SIDES = 6; 

    private Point[] points = new Point[SIDES]; 
    private Point center = new Point(0, 0); 
    private int radius; 
    private int rotation = 90; 


    public Hexagon(Point center, int xlabel, int ylabel, int radius) { 
     npoints = SIDES; 
     xpoints = new int[SIDES]; 
     ypoints = new int[SIDES]; 

     this.center = center; 
     this.radius = radius; 

     updatePoints(); 
    } 

    public Hexagon(int x, int y, int xlabel, int ylabel, int radius) { 
     this(new Point(x, y), xlabel, ylabel, radius); 
    } 


    public int getRadius() { 
     return radius; 
    } 

    public void setRadius(int radius) { 
     this.radius = radius; 

     updatePoints(); 
    } 

    public int getRotation() { 
     return rotation; 
    } 

    public void setRotation(int rotation) { 
     this.rotation = rotation; 

     updatePoints(); 
    } 

    public void setCenter(Point center) { 
     this.center = center; 

     updatePoints(); 
    } 

    public void setCenter(int x, int y) { 
     setCenter(new Point(x, y)); 
    } 

    private double findAngle(double fraction) { 
     return fraction * Math.PI * 2 + Math.toRadians((rotation + 180) % 360); 
    } 

    private Point findPoint(double angle) { 
     int x = (int) (center.x + Math.cos(angle) * radius); 
     int y = (int) (center.y + Math.sin(angle) * radius); 

     return new Point(x, y); 
    } 

    protected void updatePoints() { 
     for (int p = 0; p < SIDES; p++) { 
      double angle = findAngle((double) p/SIDES); 
      Point point = findPoint(angle); 
      xpoints[p] = point.x; 
      ypoints[p] = point.y; 
      points[p] = point; 
     } 
    } 

    public void draw(Graphics2D g, int x, int y, int lineThickness, boolean border) { 
     // Store before changing. 
     Stroke tmpS = g.getStroke(); 
     Color tmpC = g.getColor(); 

     g.setStroke(new BasicStroke(lineThickness, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER)); 

     if (border) 
      g.fillPolygon(xpoints, ypoints, npoints); 
     else 
      g.drawPolygon(xpoints, ypoints, npoints); 

     // Set values to previous when done. 

     g.setColor(tmpC); 
     g.setStroke(tmpS); 

    } 



} 

GameTest.java; fichiers de test pour ajouter conseil sur JFrame

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

/** 
    A program that allows users to edit a scene composed 
    of items. 
*/ 
public class GameTest 
{ 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     GameBoard p = new GameBoard(); 

     f.add (p, BorderLayout.CENTER); 

     f.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     f.setSize (600, 600); 
     f.setVisible (true); 
    } 
} 

Je pourrais utiliser une place de grille pour jeter les icônes hexagonales, mais défaites le but parce que je veux la grille pour aligner les uns aux autres

*-*-*-*-* 
-*-*-*-*- 
*-*-*-*-* 

ou quelque chose de similaire

Utilisé une taille de 2 dans cette ![Only used the size of 2 in this one] 1

+0

c'est le code complet? C'est tout le code que j'ai utilisé –

+0

vous avez beaucoup de défauts sérieux: bkgnd.draw (g2, x, y, 2, true); le x y n'a aucune pertinence à l'intérieur de cette méthode ... si vous êtes un débutant complet, que faites-vous avec un monstre compliqué? – gpasch

+0

Pas sûr moi-même, je pensais que je l'essayerais comme un projet. Et j'ai supposé que x et y seront définis une fois que je construirai un GameHexagon (ligne, col, x, y, vrai). Et dans le composant, il dessine avec bkgnd.draw (g2, x, y, 2, true). –

Répondre

0

Alors, j'ai remarqué que vous n'utilisez pas p olygons et la méthode .fill() qui appartient à la classe java.awt.*. Je recommanderais d'utiliser cela à la place. Voici quelques liens vers des sites Web qui peuvent vous aider avec la méthode polygone.

http://mathbits.com/MathBits/Java/Graphics/GraphingMethods.htm http://www.java2s.com/Code/Java/2D-Graphics-GUI/DrawaPolygon.htm

Hope this était utile!

+0

ajouté 'g2.fill (bkgnd)' mais les mêmes points, et Hexagon.java est un enfant de Polygon, ne devrait-il pas hériter? –

+0

C'est vrai, je n'y ai pas pensé, je vais lire attentivement votre code –

+0

Cette question a déjà été posée. Voici un lien vers la réponse: http://stackoverflow.com/questions/20734438/algorithm-to-generate-a-hexagonal-grid-with-coordinate-system –