getLocation
親コンポーネント上のコンポーネントの座標を返すHowabout 、またはgetLocationOnScreen
ディスプレイ上のコンポーネントの座標を返す ?
x と y の計算方法に関する 2 番目の質問ですが、「計算された」とはどういう意味かわかりません。座標は何かに対して相対的になります。通常、親コンポーネント (が置かJPanel
れてJButton
いる など) または画面上の位置 ( に対してgetLocation
返されるなど) のいずれかJFrame
です。
次のようなメソッドPoint.distance
は、2 つの座標の x 値と y 値を減算し、差を教えてくれます。これは単なる基本的なジオメトリです。
たとえば、 a の中心から点までの距離を返すメソッドは次のJButton
とおりです。
public static double getDistance(Point point, JComponent comp) {
Point loc = comp.getLocation();
loc.x += comp.getWidth() / 2;
loc.y += comp.getHeight() / 2;
double xdif = Math.abs(loc.x - point.x);
double ydif = Math.abs(loc.y - point.y);
return Math.sqrt((xdif * xdif) + (ydif * ydif));
}
これは、三角形の斜辺をピクセル単位の測定値として返します。つまり、指定した点 (カーソル座標など) が対角線上にある場合、有用な距離が得られます。
Point.distance
このようなことをします。
私のこの古い回答がかなりの数のビューを獲得していることに気付いたので、上記を行うためのより良い方法を次に示します(ただし、実際には数学を示していません):
public static double distance(Point p, JComponent comp) {
Point2D.Float center =
// note: use (0, 0) instead of (getX(), getY())
// if the Point 'p' is in the coordinates of 'comp'
// instead of the parent of 'comp'
new Point2D.Float(comp.getX(), comp.getY());
center.x += comp.getWidth() / 2f;
center.y += comp.getHeight() / 2f;
return center.distance(p);
}
Swing プログラムでこの種のジオメトリを示す簡単な例を次に示します。
これにより、マウス カーソルの位置に線が引かれ、線の長さ ( の中心からJPanel
カーソルまでの距離) が表示されます。
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
class DistanceExample implements Runnable {
public static void main(String[] args) {
SwingUtilities.invokeLater(new DistanceExample());
}
@Override
public void run() {
JLabel distanceLabel = new JLabel("--");
MousePanel clickPanel = new MousePanel();
Listener listener =
new Listener(distanceLabel, clickPanel);
clickPanel.addMouseListener(listener);
clickPanel.addMouseMotionListener(listener);
JPanel content = new JPanel(new BorderLayout());
content.setBackground(Color.white);
content.add(distanceLabel, BorderLayout.NORTH);
content.add(clickPanel, BorderLayout.CENTER);
JFrame frame = new JFrame();
frame.setContentPane(content);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
static class MousePanel extends JPanel {
Point2D.Float mousePos;
MousePanel() {
setOpaque(false);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (mousePos != null) {
g.setColor(Color.red);
Point2D.Float center = centerOf(this);
g.drawLine(Math.round(center.x),
Math.round(center.y),
Math.round(mousePos.x),
Math.round(mousePos.y));
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
}
static class Listener extends MouseAdapter {
JLabel distanceLabel;
MousePanel mousePanel;
Listener(JLabel distanceLabel, MousePanel mousePanel) {
this.distanceLabel = distanceLabel;
this.mousePanel = mousePanel;
}
@Override
public void mouseMoved(MouseEvent e) {
Point2D.Float mousePos =
new Point2D.Float(e.getX(), e.getY());
mousePanel.mousePos = mousePos;
mousePanel.repaint();
double dist = distance(mousePos, mousePanel);
distanceLabel.setText(String.format("%.2f", dist));
}
@Override
public void mouseExited(MouseEvent e) {
mousePanel.mousePos = null;
mousePanel.repaint();
distanceLabel.setText("--");
}
}
static Point2D.Float centerOf(JComponent comp) {
Point2D.Float center =
new Point2D.Float((comp.getWidth() / 2f),
(comp.getHeight() / 2f));
return center;
}
static double distance(Point2D p, JComponent comp) {
return centerOf(comp).distance(p);
}
}