如何制作定制尺寸的组件

时间:2015-12-29 20:29:59

标签: java swing jcomponent

我有2个组件(它们都是从jComponent派生的)。一个是地图,另一个是地图中的地区,如下图所示。

Map with Territories

到目前为止,地图是以1200x800的固定尺寸绘制的。对于每个地区,我都有一个点列表,它们将与每个国家的形状相关联。

到目前为止,所有工作都很顺利。但是当我点击一个国家时,总是会调用最后绘制的区域。似乎每个地区都是整个地图上的一层。我怎样才能使它工作,如果我点击一个只有这个被点击的领域。那么,如果我点击中国,中国的点击事件会被调用吗?

如果它有帮助,下面是2个组件的代码:

Map.java

public class Map extends JComponent {

    private Collection<Territory> territories;
    public Map(Collection<Territory> territories) {
        super();
        this.territories = territories;
    }

    @Override
    public void paintComponent(Graphics graphics)
    {
        graphics.setColor(new Color(8, 114, 200));
        graphics.fillRect(0, 0, this.getWidth(), this.getHeight());

        for (Territory tmp : this.territories) {
            TerritoryComponent territoryComponent = new TerritoryComponent(tmp);
            this.add(territoryComponent);
        }
        this.updateUI();
    }

}

TerritoryComponent.java

public class TerritoryComponent extends JComponent implements MouseListener {

    private Territory territory;

    public TerritoryComponent(Territory tmp) {
        super();
        this.setSize(this.getMaximumSize());
        this.addMouseListener(this);
        this.territory = tmp;
    }

    @Override
    public void paintComponent(Graphics graphics)
    {
        for (Patch patch : this.territory.getPatches()) {
            ArrayList<Point> points = patch.getPoints();
            int x[] = new int[points.size() + 1];
            int y[] = new int[points.size() + 1];
            for (int i = 0; i < points.size(); i++) {
                x[i] = (int) points.get(i).getX();
                y[i] = (int) points.get(i).getY();
            }
            x[points.size()] = (int) points.get(0).getX();
            y[points.size()] = (int) points.get(0).getY();

            graphics.setColor(new Color(255, 255, 255));
            graphics.fillPolygon(x, y, points.size() + 1);

            graphics.setColor(new Color(52, 52, 52));
            graphics.drawPolyline(x, y, points.size() + 1);
        }

    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("clicked " + this.territory.getName());
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }
}

1 个答案:

答案 0 :(得分:4)

  

对于每个地区,我都有一个积分列表,

  1. 创建一个多边形对象来表示您的每个地区。
  2. 将每个Polygon添加到ArrayList
  3. 在paintComponent()方法中,您只需遍历ArrayList以绘制每个Polygon
  4.   

    如果我点击单个区域,只会点击此区域。

    在mouseClicked(...)事件中,然后获取鼠标点并迭代包含所有多边形的ArrayList。然后,您可以使用Polygon.contains(...)方法来确定单击的区域。

    也不要使用updateUI()方法。只应在更改LAF时调用该方法。它尤其不应该在绘制方法中调用,因为这会导致组件可能重绘自己。