feiyuyuniao 2009-09-14 11:38
浏览 290
已采纳

如何像拖动标题栏那样拖动JFrame

我在JFrame上放了一个JLabel

在鼠标press这个JLabel时,获得当前点的坐标,和JFrame的位置坐标

然后,drag这个JLabel时候,根据当前点的坐标变化,来设置JFrame的位置...

应该是获得坐标往往是point类型的,不够精确吧...所以,效果非常不理想,不知道各位有啥好办法


按下鼠标时的操作

    private void jLabel9MousePressed(java.awt.event.MouseEvent evt) {

// TODO add your handling code here:
this.setPoint = new Point(evt.getX(), evt.getY());
location = new Point2D.Double(this.getLocation().getX(), this.getLocation().getY());
}



鼠标拖拽时的操作
    private void jLabel9MouseDragged(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
this.setLocation((int)(this.location.x + (evt.getX() - this.setPoint.x)), (int)(this.location.y + (evt.getY() - this.setPoint.y)));
}

问题补充
楼上正解啊....不过,我觉得有些怪异...是我理解的不对吧?

这样,过程A:一直press鼠标,时而drag,时而停下...

firstPoint是鼠标press的时候,得到的,在过程A中,一直不变;
location是drag时得到的,一直都在变化,当然evt获得的坐标也是不断变化的。

也就是说,location也应该在press的时候获得啊,为什么那样偏偏不对?
问题补充
为什么location 不在press时得到的?

这样做正确,可是感觉不合理啊。
问题补充
偶太笨喽...原来是相对位置的变化引起绝对位置的变化哦....搞懂了...3Q~gml520
  • 写回答

3条回答 默认 最新

  • gml520 2009-09-14 11:38
    关注

    [quote="keating"]楼上正解啊....不过,我觉得有些怪异...是我理解的不对吧?

    这样,过程A:一直press鼠标,...

    firstPoint是鼠标press的时候,得到的,在过程A中,一直不变;
    location是drag时得到的,一直都在变化,当然evt获得的坐标也是不断变化的。

    也就是说,location也应该在press的时候获得啊,为什么那样偏偏不对?[/quote]
    firstPoint 确切的说应该命名为:currentPoint,因为鼠标按下时就得到当前的鼠标相对于当前窗口的位置。
    当你时而drag,时而停下时,firstPoint也是在改变的。
    而location是当前窗口左上角相对于整个屏幕的位置。它是根据鼠标的位置变化而变化的,主要是根据鼠标位置变化的偏移量来改变的。拖动窗口是 鼠标位置不断的变化,造成Drag事件不断的促发,也就是不断的调用this.setLocation()这个方法让窗口不断的改变位置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?