4

親に関連するコンポーネントの座標を取得しようとしています。たとえば、サイズ500x500のJFrameがあり、その子JPanel[ 50, 10]にある場合、結果として[50, 10]を取得する必要があります。簡単に思えるかもしれませんが、間違った座標 ( [0, 0]または[3, 24] ) を取得し続けています。

これが私のJPanelのコードです:

class MyPanel extends JPanel implements MouseListener { 
    private Component parent;   
    private String strName;

    public MyPanel(Component pr, String name, int w, int h) {
        super();

        parent = pr;
        strName = new String(name);

        this.setLayout(null);
        this.setSize(w, h);
        this.setBackground(Color.WHITE);
        this.addMouseListener(this);

        this.setVisible(true);
    }

    /* MouseListener implementation */
    public void mouseClicked(MouseEvent event) {
            int x = event.getX(); int y = event.getY();
            Point pnt = new Point(SwingUtilities.convertPoint(this, new Point(0, 0), parent));
            System.out.println(strName + ":" + pnt);    
    }

    public void mouseEntered(MouseEvent event) { }

    public void mouseExited(MouseEvent event) { }

    public void mousePressed(MouseEvent event) { }

    public void mouseReleased(MouseEvent event) { }
}

何か案は?

Java バイナリとソース コード (*.tar.xz)

4

1 に答える 1

5

これを試して:

Point pnt = new Point(SwingUtilities.convertPoint(this, event.getPoint(), parent));

isnatead of using (提供されたスニペットでは少なくとも使用されていません):

    int x = event.getX();
    int y = event.getY();

これを行うべきではありません:

Point pnt = new Point(SwingUtilities.convertPoint(this, new Point(0,0), parent));

そうしないと、返される座標は常に (0,0) を基準にします。

あなたもすることができます(私はあなたがしようとしていたと思いますが、xとyを忘れました:P):

    int x = event.getX();
    int y = event.getY();
    Point pnt = new Point(SwingUtilities.convertPoint(this,
                                               new Point(x,y), parent));

編集:

あなたが何を望んでいるかを理解したら、なぜそのすべてのコードを気にするのですか? 各JPanelsMouseListenermouseClicked()これを行います:

public void mouseClicked(MouseEvent event) {
    System.out.println(this.getX()+" "+this.getY());//print x and why co-ords for MyJpanel
}
于 2012-08-21T19:58:16.617 に答える