无法使用MouseListener处理Hexagon(生成的多边形)

时间:2017-07-17 15:57:17

标签: java swing

我生成一个六边形网格并且能够这样做但是当我将MouseListener添加到单个六边形时(当它们被创建时),它几乎就像它们一样因为悬停/点击六边形不会注册或做任何事情。我希望能够最终与六边形进行交互,但如果我无法使其工作,我就无法做到这一点。

我的主要GUI元素:

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

public class Game2
{
    public Game2(int radius,int num_hexes)
    {
    if(num_hexes%2==0) throw new AssertionError("Can't generate map with 
    an even number of hexagons.");

    JFrame frame=new JFrame();
    JPanel panel=new JPanel();

    panel.setBorder(BorderFactory.createLineBorder(Color.RED));
    panel.setLayout(new BoxLayout(panel,1));

    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setTitle("HexGame");
    frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    frame.setLayout(new BorderLayout());

    Rectangle r=frame.getBounds();
    int screen_height=r.height;
    int screen_width=r.width;

    Hexes2 hexes2=new Hexes2(num_hexes,radius,screen_width,screen_height);

    panel.add(hexes2);
    JScrollPane scroll_pane=new JScrollPane(panel);
    frame.getContentPane().add(scroll_pane);
    panel.setOpaque(false);
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args)
{
    Runnable r=new Runnable()
    {
        @Override
        public void run()
        {
            new Game2(100,11);
        }
    };
    SwingUtilities.invokeLater(r);
}
}

我的多个六边形:

import java.awt.*;
import java.util.LinkedList;
import java.util.List;
import javax.swing.JPanel;

public class Hexes2 extends JPanel
{
private static final long serialVersionUID=1L;
private static List<Polygon> hexagons;
private static int[] rows;
private int radius;

public Hexes2(int num_columns,int radius,int screen_width,int screen_height)
{
    super();

    this.radius=radius;
    hexagons=new LinkedList<Polygon>();
    rows=Functions.columns(num_columns);

    int x=screen_width/6;
    int y=screen_height/2;

    double height=radius*Math.sqrt(3);
    double range=num_columns-rows[0];

    //build by columns, first
    for(int j=0;j<num_columns;j++)
    {
        x+=((3/2)*radius)*1.5015;

        if(j<=Math.floor(num_columns/2)) y=(int) (100-(j*(height/2)));
        else y=(int) ((100-(height*(range/2))+(num_columns-rows[j])*(height/2)));

        for(int i=0;i<rows[j];i++)
        {
            y+=height;
            Hex2 hex=new Hex2(i,radius,x,y);
            hexagons.add(hex.getHex());
        }
    }
}

protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    Graphics2D g2=(Graphics2D) g;
    setOpaque(false);

    for(int i=0;i<hexagons.size();i++)
    {
        Stroke stroke=new BasicStroke(radius/20, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
        g2.setStroke(stroke);

        g2.setColor(Color.BLACK);
        g2.drawPolygon(hexagons.get(i));
    }
}
};

我的奇异六角类:

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;

public class Hex2 extends JLabel implements MouseListener
{
private static final long serialVersionUID = 1L;
private int ID;
private Polygon hexagon;

public Hex2(int ID,int r,int x,int y)
{
    super();
    this.ID=ID;

    hexagon=generateHex(r,x,y);

    addMouseListener(this);
}

public Polygon generateHex(int r, int x, int y)
{
    Polygon hexagon=new Polygon();

    for(int i=0;i<6;i++)
    {

       /*int _x=(int) (x + r*Math.cos(Math.PI / 3.0 * i));
       int _y=(int) (y + r*Math.sin(Math.PI / 3.0 * i));*/

        int _x=(int) (x + r*Math.cos(i*2*Math.PI/6));
        int _y=(int) (y + r*Math.sin(i*2*Math.PI/6));

       hexagon.addPoint(_x,_y);
    }

    return hexagon;
}

public int getID()
{
    return ID;
}

public Polygon getHex()
{
    return hexagon;
}

@Override
public void mouseClicked(MouseEvent arg0) {
    System.out.println("Clicked on hexagon "+ID);

}

@Override
public void mouseEntered(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseExited(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void mouseReleased(MouseEvent arg0) {
    // TODO Auto-generated method stub

}
};

功能:

import java.awt.Dimension;

public class Functions
{
//takes in the max width, n (# hexagons), of the largest row (in the middle)
public static int[] columns(int n)
{
    int[] columns=new int[n];
    int deviation=(int) java.lang.Math.floor(n/2);

    for(int i=0;i<n;i++)
    {
        columns[i]=n-(java.lang.Math.abs(i-deviation));
    }

    return columns;
}

public static Dimension getScreenSize()
{
    return java.awt.Toolkit.getDefaultToolkit().getScreenSize();
}
}

我为长代码道歉,只是想彻底。任何帮助都非常感谢,提前感谢。

1 个答案:

答案 0 :(得分:1)

您将MouseListener添加到Hex2 JLabel:

scala> (0 to 99).toList.grouped(5).toList
res5: List[List[Int]] = List(List(0, 1, 2, 3, 4), List(5, 6, 7, 8, 9), List(10, 11, 12, 13, 14), List(15, 16, 17, 18, 19), List(20, 21, 22, 23, 24), List(25, 26, 27, 28, 29), List(30, 31, 32, 33, 34), List(35, 36, 37, 38, 39), List(40, 41, 42, 43, 44), List(45, 46, 47, 48, 49), List(50, 51, 52, 53, 54), List(55, 56, 57, 58, 59), List(60, 61, 62, 63, 64), List(65, 66, 67, 68, 69), List(70, 71, 72, 73, 74), List(75, 76, 77, 78, 79), List(80, 81, 82, 83, 84), List(85, 86, 87, 88, 89), List(90, 91, 92, 93, 94), List(95, 96, 97, 98, 99))

这些是您从未添加到GUI的JLabel,因为您在A行创建它们:

public Hex2(int ID, int r, int x, int y) {
    super();
    this.ID = ID;
    hexagon = generateHex(r, x, y);
    addMouseListener(this);
}

但是,从不将hex添加到GUI中。而是添加了由 for (int j = 0; j < num_columns; j++) { x += ((3 / 2) * radius) * 1.5015; if (j <= Math.floor(num_columns / 2)) y = (int) (100 - (j * (height / 2))); else y = (int) ((100 - (height * (range / 2)) + (num_columns - rows[j]) * (height / 2))); for (int i = 0; i < rows[j]; i++) { y += height; Hex2 hex = new Hex2(i, radius, x, y); // ****** [A] ***** hexagons.add(hex.getHex()); // ****** [B] ***** } } 返回的其他内容,因此MouseListener无法正常工作。需要将MouseListener添加到GUI中可视化的组件中,以便其执行任何操作。

我认为你在这里使用了太多的组件。只有一个组件(JPanel)应该完成所有绘图,并且应该添加MouseLIstener。其他所有内容都应该是逻辑类,这些类不会扩展Swing组件类。

例如,运行以下代码。它显示十六进制作为非组件类,一个响应MouseListener,因为侦听器仅添加到单个绘图JLabel。多边形是形状,并且具有getHex()方法,可以在鼠标监听器内部使用,以允许它们“知道”#34;当他们被按下时:

contains(Point p)