9

ウィンドウが装飾されていないときに、ウィンドウ内のパネルの 1 つをクリックしてウィンドウを移動する可能性はありますか?

40 ピクセル サイズのマットな境界線を持つメイン パネルと、内部にコントロールを含むいくつかのパネルがあり、その境界線をクリックしたときにウィンドウを移動したいと考えています。それは可能ですか?

4

5 に答える 5

36

境界線のあるパネルの上に別のパネルを配置して、境界線を表示したままにすることができます。次のコードを使用して、ウィンドウを移動します。

public class MotionPanel extends JPanel{
    private Point initialClick;
    private JFrame parent;

    public MotionPanel(final JFrame parent){
    this.parent = parent;

    addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            initialClick = e.getPoint();
            getComponentAt(initialClick);
        }
    });

    addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {

            // get location of Window
            int thisX = parent.getLocation().x;
            int thisY = parent.getLocation().y;

            // Determine how much the mouse moved since the initial click
            int xMoved = e.getX() - initialClick.x;
            int yMoved = e.getY() - initialClick.y;

            // Move window to this position
            int X = thisX + xMoved;
            int Y = thisY + yMoved;
            parent.setLocation(X, Y);
        }
    });
    }
}

装飾されていないウィンドウ用のカスタム タイトルバーを作成するために、しばらくこのコードを使用してきました。PS: JPanel の代わりに JComponent を拡張することで、この例を一般化できます。

于 2012-11-01T05:36:16.173 に答える
4

40 ピクセル サイズのマットな境界線を持つメイン パネルと、内部にコントロールを含むいくつかのパネルがあり、その境界線をクリックしたときにウィンドウを移動したい

@camickrの ComponetMover はあなたにぴったりのクラスだと思います

于 2012-05-27T12:27:10.953 に答える
1

はい、それは非常に可能です。マウスイベントをリッスンするには、MouseListenerが必要です。マウスダウンで移動を開始し、マウスアップで移動を停止します。次に、そのフェーズでマウスが移動するのと同じ量だけウィンドウの位置を移動します(古いマウスの位置と新しいマウスの位置の間のデルタを計算し、それをフレームの位置に追加します)。これは、マウスリスナーを使用してかなり簡単に実行できるはずです。

于 2012-05-27T12:04:55.143 に答える
0
int xMoved = (thisX + e.getX()) - (thisX + initialClick.x);

thisX + -thisX = 0

int xMoved = e.getX()-initialClick.x;

私が使っているもの。

public class MouseLiestenerX implements MouseListener,MouseMotionListener{

private theFrame;

public MouseLiestenerX(Frame theFrame){
this.theFrame = theFrame;

}

private Point startClick;

public void mouseDragged(MouseEvent e) {
    int deltaX = e.getX()-startClick.x;
    int deltaY = e.getY()-startClick.y;

    Core.getSp().setLocation(theFrame.getLocation().x+deltaX, theFrame.getLocation().y+deltaY);
}

public void mousePressed(MouseEvent e) {
    startClick = e.getPoint();
}

public void mouseMoved(MouseEvent e){

}
@Override
public void mouseClicked(MouseEvent e) {


}
@Override
public void mouseEntered(MouseEvent e) {
    // TODO Auto-generated method stub

}
@Override
public void mouseExited(MouseEvent e) {
    // TODO Auto-generated method stub

}
@Override
public void mouseReleased(MouseEvent e) {

}

}

そしてあなたの Frame コンストラクターで

MouseLiestenerX IMove = new MouseLiestenerX(this);      
addMouseListener(IMove);
addMouseMotionListener(IMove);
于 2016-06-13T20:19:34.383 に答える