这是一个完整的鼠标适配器我现在使用很长一段时间:
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* @see http://stackoverflow.com/a/12456113/909085
*/
public class WindowResizeAdapter extends MouseAdapter implements SwingConstants
{
private boolean resizing = false;
private int prevX = -1;
private int prevY = -1;
private int resizeSide = 0;
public static void install (Component component, int resizeSide)
{
WindowResizeAdapter wra = new WindowResizeAdapter (resizeSide);
component.addMouseListener (wra);
component.addMouseMotionListener (wra);
}
public WindowResizeAdapter (int resizeSide)
{
super();
this.resizeSide = resizeSide;
}
public void mousePressed (MouseEvent e)
{
if (SwingUtilities.isLeftMouseButton (e))
{
resizing = true;
}
prevX = e.getXOnScreen();
prevY = e.getYOnScreen();
}
public void mouseDragged (MouseEvent e)
{
if (prevX != -1 && prevY != -1 && resizing)
{
Window w = SwingUtilities.getWindowAncestor (e.getComponent());
Rectangle rect = w.getBounds();
Dimension dim;
boolean undecorated;
if (w instanceof JDialog)
{
dim = ((JDialog) w).getContentPane().getPreferredSize();
undecorated = ((JDialog) w).isUndecorated();
}
else if (w instanceof JFrame)
{
dim = ((JFrame) w).getContentPane().getPreferredSize();
undecorated = ((JFrame) w).isUndecorated();
}
else
{
dim = w.getPreferredSize();
undecorated = true;
}
// Checking for minimal width and height
int xInc = e.getXOnScreen() - prevX;
int yInc = e.getYOnScreen() - prevY;
if (undecorated)
{
if (resizeSide == SwingConstants.NORTH_WEST || resizeSide == SwingConstants.WEST ||
resizeSide == SwingConstants.SOUTH_WEST)
{
if (rect.width - xInc < dim.width)
{
xInc = 0;
}
}
else if (resizeSide == SwingConstants.NORTH_EAST ||
resizeSide == SwingConstants.EAST ||
resizeSide == SwingConstants.SOUTH_EAST)
{
if (rect.width + xInc < dim.width)
{
xInc = 0;
}
}
if (resizeSide == SwingConstants.NORTH_WEST ||
resizeSide == SwingConstants.NORTH ||
resizeSide == SwingConstants.NORTH_EAST)
{
if (rect.height - yInc < dim.height)
{
yInc = 0;
}
}
else if (resizeSide == SwingConstants.SOUTH_WEST ||
resizeSide == SwingConstants.SOUTH ||
resizeSide == SwingConstants.SOUTH_EAST)
{
if (rect.height + yInc < dim.height)
{
yInc = 0;
}
}
}
// Resizing window if any changes are done
if (xInc != 0 || yInc != 0)
{
if (resizeSide == SwingConstants.NORTH_WEST)
{
w.setBounds (rect.x + xInc, rect.y + yInc, rect.width - xInc,
rect.height - yInc);
}
else if (resizeSide == SwingConstants.NORTH)
{
w.setBounds (rect.x, rect.y + yInc, rect.width, rect.height - yInc);
}
else if (resizeSide == SwingConstants.NORTH_EAST)
{
w.setBounds (rect.x, rect.y + yInc, rect.width + xInc, rect.height - yInc);
}
else if (resizeSide == SwingConstants.WEST)
{
w.setBounds (rect.x + xInc, rect.y, rect.width - xInc, rect.height);
}
else if (resizeSide == SwingConstants.EAST)
{
w.setBounds (rect.x, rect.y, rect.width + xInc, rect.height);
}
else if (resizeSide == SwingConstants.SOUTH_WEST)
{
w.setBounds (rect.x + xInc, rect.y, rect.width - xInc, rect.height + yInc);
}
else if (resizeSide == SwingConstants.SOUTH)
{
w.setBounds (rect.x, rect.y, rect.width, rect.height + yInc);
}
else if (resizeSide == SwingConstants.SOUTH_EAST)
{
w.setBounds (rect.x, rect.y, rect.width + xInc, rect.height + yInc);
}
prevX = e.getXOnScreen();
prevY = e.getYOnScreen();
}
}
}
public void mouseReleased (MouseEvent e)
{
resizing = false;
}
}
只需使用其“安装”方法将窗口调整大小行为添加到任何组件。 resizeSide变量用于定义窗口的哪一侧应调整大小(例如,SwingConstants.SOUTH_EAST将强制组件调整窗口的右下角)。
编辑:您可能还想修改特定情况下的代码,以便仅从组件上的某个特定区域开始拖动(调整大小)。只需修改mousePressed方法即可。也
看到这个[答案](http://stackoverflow.com/a/2784584/230513)响应于这个[问题](http://stackoverflow.com/q/2780780/230513)。 – trashgod