单击JPanel移动未修饰的窗口

当该窗口未修饰时,是否有可能通过单击窗口中的一个面板来移动窗口?

我有一个带有哑光边框40像素大小的主面板,里面有几个带控件的面板,我想在点击边框时移动窗口。 那可能吗?

您可以使用边框面板上放置另一个面板,使边框可见。使用以下代码移动窗口。

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:您可以通过扩展JComponent而不是JPanel来概括此示例。

我有一个带有哑光边框40像素大小的主面板,里面有几个带控件的面板,我想在点击边框时移动窗口

我认为@camickr的ComponetMover对你来说是正确的

是的,很有可能。 您需要一个MouseListener来侦听鼠标事件。 你开始转向mousedown并停止继续前进。 然后,您只需将窗口位置转换为鼠标在该阶段转换的相同数量(计算旧鼠标位置和新鼠标位置的增量并将其添加到帧位置)。 您应该可以非常轻松地使用鼠标监听器来完成此操作。

我的项目有一个简单的解决方案。 这是我未修饰的JDialog类。

 public class TimerDialog extends JDialog { // some fields here private Point mouseClickPoint; // Will reference to the last pressing (not clicking) position private TimerDialog() { initComponents(); addEventsForDragging(); } private void addEventsForDragging() { // Here is the code does moving addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { mouseClickPoint = e.getPoint(); // update the position } }); addMouseMotionListener(new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { Point newPoint = event.getLocationOnScreen(); newPoint.translate(-mouseClickPoint.x, -mouseClickPoint.y); // Moves the point by given values from its location setLocation(newPoint); // set the new location } }); } private void initComponents() { setLayout(new FlowLayout()); // adding components setDefaultCloseOperation(DISPOSE_ON_CLOSE); setAlwaysOnTop(true); setUndecorated(true); setResizable(false); pack(); } } 

这个代码适用于单个监视器。

class Frame扩展JFrame {

 private int framePositionX, framePositionY, mousePositionX, mousePositionY, newMousePositionX, newMousePositionY; Frame(){ addMouseListener(new MouseListener() { @Override public void mouseClicked(MouseEvent mouseEvent) { framePositionX = mouseEvent.getComponent().getX(); framePositionY = mouseEvent.getComponent().getY(); mousePositionX = mouseEvent.getX(); mousePositionY = mouseEvent.getY(); } @Override public void mousePressed(MouseEvent mouseEvent) { framePositionX = mouseEvent.getComponent().getX(); framePositionY = mouseEvent.getComponent().getY(); mousePositionX = mouseEvent.getX(); mousePositionY = mouseEvent.getY(); } @Override public void mouseReleased(MouseEvent mouseEvent) { } @Override public void mouseEntered(MouseEvent mouseEvent) { } @Override public void mouseExited(MouseEvent mouseEvent) { } }); addMouseMotionListener(new MouseAdapter() { @Override public void mouseDragged(MouseEvent e) { newMousePositionX = e.getX(); newMousePositionY = e.getY(); int newFramePositionX = (newMousePositionX - mousePositionX)+ framePositionX; int newFramePositionY = (newMousePositionY - mousePositionY)+ framePositionY; e.getComponent().setLocation(newFramePositionX, newFramePositionY); } }); setUndecorated(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); pack(); setVisible(true); } 

}

 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);