getBounds()
дает вам Rectangle
с положением и размерами кнопки относительно ее родителя.В моем примере родитель - это JFrame
.
public class Click {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
final JFrame f = new JFrame("Click pos");
f.setSize(640, 480);
final JButton b = new JButton("Click Me!");
b.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
final JButton bb = (JButton) e.getSource();
final Rectangle bbox = bb.getBounds();
final int x = bbox.x + e.getX();
final int y = bbox.y + e.getY();
JOptionPane.showMessageDialog(f, "pos: " + x + " " + y);
}
});
f.getContentPane().add(b, BorderLayout.SOUTH);
f.setVisible(true);
}
});
}
}
Редактировать:
С помощью вспомогательных методов из SwingUtilities метод mouseClicked
становится намного проще.И вы получите правильные координаты независимо от того, сколько контейнеров находится между JFrame
и JButton
.Я не знал о них.
final JButton bb = (JButton) e.getSource();
Point p = SwingUtilities.convertPoint(bb, e.getPoint(), f);
JOptionPane.showMessageDialog(f, p);