我见过一些海报认为不应该扩展Swing组件,而应该通过组合添加该功能。所以说我想重复创建一个带有绝对定位的JPanel
(没有布局管理器),我可以用鼠标重新定位组件:
public class MoveableComponentPanel
{
private final JPanel m_panel;
public MoveableComponentPanel()
{
m_panel = new JPanel(null);
}
public void add(Component c)
{
m_panel.add(c);
c.addMouseListener(m_mover);
c.setSize(c.getPreferredSize());
}
private final MouseListener m_mover = new MouseListener()
{
private int m_startX, m_startY;
@Override
public void mousePressed(MouseEvent e)
{
if (e.getButton() == MouseEvent.BUTTON1)
{
m_startX = e.getX();
m_startY = e.getY();
}
}
@Override
public void mouseReleased(MouseEvent e)
{
if (e.getButton() == MouseEvent.BUTTON1)
{
Component c = e.getComponent();
Point p = c.getLocation();
p.x += e.getX() - m_startX;
p.y += e.getY() - m_startY;
c.setLocation(p);
c.repaint();
}
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
};
}
看起来不错,但无法将面板添加到容器中。如果我想让一个调用类与面板交互,那么进一步令人头痛,例如改变大小,背景颜色,注册事件监听器等。要么我添加一个getPanel()
访问器,它打破了封装,或者为我想要公开的JPanel
方法/属性编写传递方法(可能很多) )。我在这里缺少一些其他策略吗?什么是公认的最佳做法?
答案 0 :(得分:1)
我可以用鼠标重新定位组件:
然后,您只需将MouseListener/MouseMotionListener
添加到要拖动的组件即可。无需扩展任何组件即可添加该功能。
查看Component Mover类,了解基本拖动组件的方法示例以及更复杂的拖动解决方案。