2013-03-03 42 views
1

我遇到以下代碼的問題。我的意圖是使用getPoint將鼠標點擊的座標存儲到數組列表中,然後在用戶單擊的每個位置繪製一個矩形。我已經搜索瞭如何從getPoint對象中單獨提取x和y座標而無濟於事。我是新來的Java,就是給我的麻煩在編譯時的路線是:存儲在getPoint()對象中的座標

g2.drawRect(coordinateList(J).getHeight(),coordinateList(j.getWidth(),3,3);

我知道我可能離開,但我怎麼能從一個數組列表中單獨提取一個點的x和y座標,以便在新的點擊點處重新繪製一個矩形,並且還以前所有的點擊呢?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.awt.event.MouseListener; 
import java.awt.Point; 
import java.util.*; 

public class ClickCloud extends JPanel 
{ 
    private int pointxy; 
    //private Rectangle2D.Double r1; 
    private boolean mouseClick; 
    private int count; 
    //private Point[] points; 
    private Point coordinates = new Point(0, 0); 
    private ArrayList<Point> coordinateList = new ArrayList<Point>(); 

    public ClickCloud() { 
     this.setPreferredSize(new Dimension(500,500)); 
     this.addMouseListener(new MyMouseListener()); 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 

     for (int j = 0; j < count; j++) { 
      g2.setStroke(new BasicStroke(1.0f)); 
      g2.setPaint(Color.BLUE); 
      g2.drawRect(coordinateList(j).getHeight(),coordinateList(j.getWidth(),3,3); 
     } 
    } 

    private class MyMouseListener implements MouseListener { 
     public void mouseClicked(MouseEvent me) { 
      count++; 
      coordinates.setLocation(me.getPoint()); 
      coordinateList.add(coordinates.getLocation()); 
      repaint(); 
     } 
     public void mousePressed(MouseEvent me) { } 
     public void mouseReleased(MouseEvent me) { } 
     public void mouseEntered(MouseEvent me) { } 
     public void mouseExited(MouseEvent me) { } 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame("ClickCloud demo"); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     f.setLayout(new FlowLayout()); 
     f.add(new ClickCloud()); 
     f.pack(); 
     f.setVisible(true);   
    } 
} 

感謝,

牛逼

回答

2

忘記了所有的getLocationsetLocation。這是多餘的。只需在您的coordinateList中儲存me.getPoint()即可。

然後,您可以分別獲得xy座標,分別爲point.getX()point.getY()

paintComponent,有遍歷點的列表更簡單的方法:

for (Point coordinate : coordinateList) { //"for each coordinate in coordinateList" 
    //do something with coordinate.getX() and coordinate.getY() 
} 
+0

對不起,很明顯,我不知道如何在代碼中正確發佈代碼。請跟我來。 – user2129525 2013-03-03 19:32:28

+0

太好了,看起來像這肯定是在某處,現在的問題是getX()和getY()會給出double值,其中drawRect只需要ints。所以我認爲我必須首先將這些值改爲整數。我可以直接在我的paintComponent方法中執行此操作嗎?(點座標:座標列表){ g2.setStroke(new BasicStroke(1.0f)); g2.setPaint(Color.BLUE); g2.drawRect(coordinate.getX(),coordinate.getY(),3,3); } } 'code' 謝謝, T – user2129525 2013-03-03 19:33:29

+0

如何在評論中包裝代碼以正確顯示它? – user2129525 2013-03-03 19:34:33

0

你是不是從ArrayList中獲取正確的點。

g2.drawRect(coordinateList(j).getHeight(),coordinateList(j.getWidth(),3,3); 

要在索引j有一個ArrayList獲得該項目,只需使用方法get()

Point point = coordinateList.get(j); 

那麼問題是,point僅代表,以及,點...他們只有X和Y座標,而不是寬度和高度。如果我試圖猜測你想要做什麼,假設你想畫3x3的長方形,其中用戶點擊,你會打電話drawRect()這樣的:

g2.drawRect(point.getX(), point.getY(), 3, 3); 

另外:

  • 你不」你需要處理一個count變量來知道你在ArrayList中的點數。只需使用coordinateList的size()方法,或者更好的方法是使用enhanced for loop
  • 您可以使用MouseAdapter而不是MouseListener來僅覆蓋所需的事件。
  • 你不需要coordinates成員和get/setLocation的東西。只寫coordinateList.add(me.getPoint());