0

pt.distance() メソッドと同様に、Jbutton の (x,y) 形式で座標を取得する方法はありますか。jbutton は setLayout(null) と setBounds(x,y,0,0) を利用します。pt.distance() と Jbutton(x,y) の結果を比較するにはどうすればよいですか?

最後に、(x,y) はどのように計算されますか?

 Point pt = evt.getPoint();
    double u = pt.distance((double)x,(double)y);
    double k = st1.getAlignmentX();
    double p = st1.getAlignmentY();
    if(u > ){ // u has to be measured to (x,y) value of jbutton
    tim.setDelay(500);
    }
    if(u < ){
    tim.setDelay(100);
    }
4

3 に答える 3

2

bypt.distance()の場合、メソッドを参照している場合は、次のPoint2D.distance()ように進めることができます。

Point location = button.getLocation(); // where button is your JButton object
double distance = pt.distance(location); // where pt is your Point2D object

または:

double distance = pt.distance(button.getX(), button.getY());

にはPoint、ボタンの x 座標と y 座標が含まれます。レイアウトを使用していない場合、これらの値は設定した値になります。ただし、レイアウトを使用している場合はLayoutManager、親の が値の計算を担当します。

あなたの編集への対応: あなたが何をしようとしているのかわかりません。を呼び出しsetLayout(null)てもJButton、ボタンの座標を設定することはできません。子だけです。これがあなたが達成しようとしていることだと思います:

Point pt = evt.getPoint();
double distance = pt.distance(button);
int someLength = 100; // the distance away from the button the point has to be to decide the length of the delay    

if (distance < someLength) {
    tim.setDelay(500);
} else {
    tim.setDelay(100);
}
于 2013-10-27T05:10:48.400 に答える
2

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);
    }
}
于 2013-10-27T05:15:01.987 に答える