Code
JPopupMenu popup = new JPopupMenu();
popup.setBorder(BorderFactory.createEmptyBorder());
popup.setPopupSize(240, 120);
JLabel bottom = new JLabel("", new DotIcon(), SwingConstants.CENTER);
MouseInputListener rwl = new ResizeWindowListener(popup);
bottom.addMouseListener(rwl);
bottom.addMouseMotionListener(rwl);
bottom.setCursor(Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR));
bottom.setOpaque(true);
bottom.setBackground(new Color(0xE0_E0_E0));
bottom.setFocusable(false);
JPanel resizePanel = new JPanel(new BorderLayout());
resizePanel.add(scroll);
resizePanel.add(bottom, BorderLayout.SOUTH);
resizePanel.add(Box.createHorizontalStrut(240), BorderLayout.NORTH);
resizePanel.setBorder(BorderFactory.createLineBorder(new Color(0x64_64_64)));
JPopupMenu popup = new JPopupMenu();
popup.add(resizePanel);
// ...
class ResizeWindowListener extends MouseInputAdapter {
private final Rectangle rect = new Rectangle();
private final JPopupMenu popup;
private final Point startPt = new Point();
private final Dimension startDim = new Dimension();
protected ResizeWindowListener(JPopupMenu popup) {
this.popup = popup;
}
@Override public void mousePressed(MouseEvent e) {
rect.setSize(popup.getSize());
startDim.setSize(popup.getSize());
startPt.setLocation(e.getComponent().getLocationOnScreen());
}
@Override public void mouseDragged(MouseEvent e) {
rect.height = startDim.height + e.getLocationOnScreen().y - startPt.y;
popup.setPreferredSize(rect.getSize());
Window w = SwingUtilities.getWindowAncestor(popup);
if (w != null && w.getType() == Window.Type.POPUP) {
// Popup$HeavyWeightWindow
w.setSize(rect.width, rect.height);
} else {
// Popup$LightWeightWindow
popup.pack();
}
}
}
References