這是一個完整的鼠標適配器我現在使用很長一段時間:
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