Java 获取JPanel Netbeans上的单击目标
我是Java编程新手,我正在尝试制作一个2D游戏。 我在网站上搜索我的问题的答案,但我没有找到,所以我希望我做的是对的。 所以,我得到了一个名为Board的类,它扩展了JPanel并实现了ActionListener。 在这块板上,我画了一些“区域”,这是一个带有关联图像的类。 我的问题是,当我点击黑板时,我想得到我点击的“区域”,但实际上我得到的是带有mouseclick事件的黑板。 我希望我能理解,这是董事会课程:Java 获取JPanel Netbeans上的单击目标,java,swing,netbeans,jpanel,Java,Swing,Netbeans,Jpanel,我是Java编程新手,我正在尝试制作一个2D游戏。 我在网站上搜索我的问题的答案,但我没有找到,所以我希望我做的是对的。 所以,我得到了一个名为Board的类,它扩展了JPanel并实现了ActionListener。 在这块板上,我画了一些“区域”,这是一个带有关联图像的类。 我的问题是,当我点击黑板时,我想得到我点击的“区域”,但实际上我得到的是带有mouseclick事件的黑板。 我希望我能理解,这是董事会课程: public class Board extends JPanel impl
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);
}
AJComponent
likeBoard
查看鼠标事件相对于其左上角的点(0,0)
默认情况下。要获取内部坐标,您可以
- 使用零部件网格,如图所示
- 通过坐标的线性缩放来插值点,如图所示
区域
类的代码。谢谢!这正是我要找的!!我在您的解决方案中遇到了一个新问题,我想要一个特殊的网格,例如:第1行:第1区第2区第3区第4区第5区第6区第6区第6区有可能有这样的网格布局吗s类型?我会使用Gridlayout(3,3)
。您可能想发布一个新问题;包括一个说明您遇到的任何问题的问题。好的,我会尝试使用3x3。非常感谢您的帮助