Java 获取JPanel Netbeans上的单击目标

Java 获取JPanel Netbeans上的单击目标,java,swing,netbeans,jpanel,Java,Swing,Netbeans,Jpanel,我是Java编程新手,我正在尝试制作一个2D游戏。 我在网站上搜索我的问题的答案,但我没有找到,所以我希望我做的是对的。 所以,我得到了一个名为Board的类,它扩展了JPanel并实现了ActionListener。 在这块板上,我画了一些“区域”,这是一个带有关联图像的类。 我的问题是,当我点击黑板时,我想得到我点击的“区域”,但实际上我得到的是带有mouseclick事件的黑板。 我希望我能理解,这是董事会课程: public class Board extends JPanel impl

我是Java编程新手,我正在尝试制作一个2D游戏。 我在网站上搜索我的问题的答案,但我没有找到,所以我希望我做的是对的。 所以,我得到了一个名为Board的类,它扩展了JPanel并实现了ActionListener。 在这块板上,我画了一些“区域”,这是一个带有关联图像的类。 我的问题是,当我点击黑板时,我想得到我点击的“区域”,但实际上我得到的是带有mouseclick事件的黑板。 我希望我能理解,这是董事会课程:

public class Board extends JPanel implements ActionListener {
    private List<Zone> zones = new ArrayList<Zone>();

    public Board() {
        addMouseListener(new TAdapter());
        setFocusable(true);
        setBackground(Color.BLACK);
        setDoubleBuffered(true);
        Dalle[] dalle1C = new Dalle[]{new Dalle()};
        zones.add(new Zone(false, false, dalle1C, null, "zone1D1C.jpg", 0, 0));
        zones.add(new Zone(false, false, dalle1C, null, "zone2D1C.jpg", 150, 0));
        timer = new Timer(5, this);
        timer.start();
    }

    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        for (Zone zone : zones) {
            g2d.drawImage(zone.getImage(), zone.getX(), zone.getY(), this);
        }
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }

    public void actionPerformed(ActionEvent e) {
        repaint();  
    }


    private class TAdapter extends MouseAdapter {

        public void mouseClicked(MouseEvent e) {
            //Here, instead of using x,y positions I want to get something like "e.getClickedObject()"
            Integer x = e.getX();
            Integer y = e.getY();
            Zone zone_selected = null;
            for (Zone zone : zones) {
                if (x > zone.getX() && x < zone.getX_end() && y < zone.getY_end() && y > zone.getY(){
                    zone_selected = zone;
                }
            }
            zones.remove(zone_selected);
            // And Here I want to use repaint method but this is not possible if you have a solution...
        }
    }

}
公共类板扩展JPanel实现ActionListener{
私有列表区域=新的ArrayList();
公共委员会(){
addMouseListener(新的TAdapter());
设置聚焦(真);
挫折背景(颜色:黑色);
setDoubleBuffered(真);
Dalle[]dalle1C=新Dalle[]{new Dalle()};
添加(新区域(false,false,dalle1C,null,“zone1D1C.jpg”,0,0));
添加(新区域(false、false、dalle1C、null,“zone2D1C.jpg”,150,0));
定时器=新定时器(5,此);
timer.start();
}
公共空间涂料(图g){
超级油漆(g);
Graphics2D g2d=(Graphics2D)g;
用于(分区:分区){
g2d.drawImage(zone.getImage(),zone.getX(),zone.getY(),this);
}
getDefaultToolkit().sync();
g、 处置();
}
已执行的公共无效操作(操作事件e){
重新油漆();
}
私有类TAdapter扩展了MouseAdapter{
公共无效mouseClicked(MouseEvent e){
//在这里,我不使用x,y位置,而是希望得到类似“e.getClickedObject()”的内容
整数x=e.getX();
整数y=e.getY();
所选区域=空;
用于(分区:分区){
如果(x>zone.getX()&&xzone.getY(){
所选区域=区域;
}
}
区域。删除(已选择区域);
//在这里,我想使用重绘方法,但这是不可能的,如果你有一个解决方案。。。
}
}
}
以及分区类别:

public class Zone {
private String name;
private boolean piece;
private boolean egout;
private List<Dalle> dalles = new ArrayList<Dalle>();
private List<Connexion> connexions = new ArrayList<Connexion>();
private List<Personnage> personnages = new ArrayList<Personnage>();
private Image image;
private Integer x;
private Integer y;
public Integer x_end;
public Integer y_end;

public Zone(boolean piece, boolean egout, Dalle[] dalles, List<Connexion> connexions, String image_name, Integer x, Integer y) {
    this.piece = piece;
    this.egout = egout;
    this.dalles.addAll(Arrays.asList(dalles));
    for(Dalle dalle : dalles) {
        dalle.addZone(this);
    }
    this.name = image_name;
    this.connexions = connexions;
    ImageIcon ii = new ImageIcon(this.getClass().getResource(image_name));
    image = ii.getImage();
    this.x = x;
    this.y = y;
    this.x_end = x + image.getWidth(null);
    this.y_end = y + image.getHeight(null);
}
公共类区域{
私有字符串名称;
私有布尔块;
私有布尔egout;
private List dalles=new ArrayList();
私有列表连接=新的ArrayList();
private List personnages=new ArrayList();
私有图像;
私有整数x;
私有整数y;
公共整数x_end;
公共整数y_结束;
公共区域(布尔块、布尔egout、Dalle[]dalles、列表连接、字符串图像名称、整数x、整数y){
这件=件;
this.egout=egout;
this.dalles.addAll(Arrays.asList(dalles));
用于(Dalle-Dalle:dalles){
dalle.addZone(本);
}
this.name=image\u name;
this.connexions=connexions;
ImageIcon ii=新的ImageIcon(this.getClass().getResource(image_name));
image=ii.getImage();
这个.x=x;
这个。y=y;
this.x_end=x+image.getWidth(null);
this.y_end=y+image.getHeight(null);
}

A
JComponent
like
Board
查看鼠标事件相对于其左上角的点(
0,0)
默认情况下。要获取内部坐标,您可以

  • 使用零部件网格,如图所示

  • 通过坐标的线性缩放来插值点,如图所示


请提供
区域
类的代码。谢谢!这正是我要找的!!我在您的解决方案中遇到了一个新问题,我想要一个特殊的网格,例如:第1行:第1区第2区第3区第4区第5区第6区第6区第6区有可能有这样的网格布局吗s类型?我会使用
Gridlayout(3,3)
。您可能想发布一个新问题;包括一个说明您遇到的任何问题的问题。好的,我会尝试使用3x3。非常感谢您的帮助