0

クリック アンド ドラッグで再配置できる JWindows があるプログラムがあります。参考までに、それらは透明で、青い境界線が付いています。クリック アンド ドラッグで再配置した後の長方形 (境界線) の左上隅の座標を知りたいです。GUI のボタンをクリックすると、captureComponent() が呼び出され、ボックスの左上隅の現在の x 座標と y 座標が取得されます。私は Point loc = this.getLocation(); でこれをやろうとしています。MousePressed の外側に配置すると、クリックして別の場所にドラッグする前に座標を取得します。更新された値を取得できるようにMousePressed内に配置しようとすると、シンボルが見つからないというエラーが表示されます:メソッドgetLocation()。更新された値が得られるように、この問題を修正するにはどうすればよいですか?

import javax.swing.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Point;
import javax.swing.border.LineBorder;

//test
public class Box extends JWindow {

    JPanel p=new JPanel();    
    public Box()            
    {

        this.setAlwaysOnTop(true);  
        this.setBackground(new Color(0, 0, 0, 0));
        setContentPane(p);   
        setSize(50,25);
        //this.setLocation(50, 50);

        p.setBorder(new LineBorder(Color.blue));
        p.setLayout(new FlowLayout());
        p.setBackground(new Color(0, 0, 0, 0));
        p.addMouseListener(adapter);
        p.addMouseMotionListener(adapter);

    }

    MouseAdapter adapter= new MouseAdapter()
    {

      int x,y; 
      public void mousePressed(MouseEvent e)
      {   
          if(e.getButton()==MouseEvent.BUTTON1)
        {            
            x = e.getX();
            y = e.getY();            
        }          
      }

      public void mouseDragged(MouseEvent e)
      {
          if( (e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0)
          {
            setLocation(e.getXOnScreen()-x,e.getYOnScreen()-y);
            Point loc = this.getLocation();

          }
      }             

    };


    public void captureComponent()  {


        System.out.println(loc);


    }

}

ボタンが押されると、captureComponent メソッドが別のクラスから呼び出されます。

    btnSnap.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent event) {
    JButton clickedButton = (JButton) event.getSource();
    if (clickedButton == btnSnap) {

                    //new captureComponent();
                    //System.out.println("test");
                    Box capture = new Box();
                    capture.captureComponent(); 
    }                
}
    });
4

1 に答える 1

1

シンボルが見つからないというエラーが表示されます:メソッドgetLocation()。

MouseListener はコンポーネントではないため、コンポーネントへの参照がない限り、メソッドを使用できません。

1 つの方法は、イベントを生成したコンポーネントのウィンドウを取得することです。

Component component = e.getComponent();
Window window = SwingUtilities.windowForComponent( component );
Point location = window.getLocation();

編集:

GUI のボタンをクリックすると、captureComponent() が呼び出され、ボックスの左上隅の現在の x 座標と y 座標が取得されます。

最初に上記のステートメントを見逃しました。コードを複雑にしすぎています。ボタンをクリックしたときにウィンドウの位置を知りたいだけの場合は、getLocation()メソッドでメソッドを呼び出すだけcaptureComponent()です。ウィンドウをドラッグするたびに場所を保存する必要はありません。

于 2015-12-28T01:06:37.597 に答える