2014-11-02 121 views
1

我是Java編程新手,並且>我正在嘗試製作2D遊戲。 我在網站上搜索我的問題的答案,但我沒有找到它,所以我希望我做的是正確的事情。 所以,我得到了一個名爲Board的類,它擴展了JPanel並實現了ActionListener。 在這個委員會中,我畫了一些「區域」,這是一個關聯圖像的類。 我的問題是,當我點擊主板時,我想獲得我點擊的「區域」,但實際上我通過mouseClicked事件獲得了主板。 我希望我是可以理解的,這裏的板類:在JPanel上獲得點擊目標Netbeans

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... 
     } 
    } 

} 

和區域類:

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); 
} 
+1

請提供'Zone'類的代碼。 – afzalex 2014-11-02 13:10:43

+0

提供的代碼! – user3734658 2014-11-02 13:17:50

回答

1

一個JComponentBoard看到相對鼠標事件,它的左上角,點( 0, 0)默認情況下,爲了獲得內部的座標,可以

  • 使用組件的網格,如圖所示here

  • 通過座標的線性縮放來插值點,如here所示。

+0

謝謝!這正是我正在尋找的! – user3734658 2014-11-02 13:35:41

+0

不客氣。 – trashgod 2014-11-02 13:40:41

+0

我解決了一個新問題,我想要一個特殊的網格,例如:line 1:Zone1 Zone2 Zone3 Zone4 Zone4 Zone5 Zone6 Zone6 Zone6 是否有可能擁有此類型的gridLayout? – user3734658 2014-11-02 14:06:57