如何不扩展Swing组件?

时间:2016-12-15 06:07:46

标签: java swing oop

我见过一些海报认为不应该扩展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方法/属性编写传递方法(可能很多) )。我在这里缺少一些其他策略吗?什么是公认的最佳做法?

1 个答案:

答案 0 :(得分:1)

  

我可以用鼠标重新定位组件:

然后,您只需将MouseListener/MouseMotionListener添加到要拖动的组件即可。无需扩展任何组件即可添加该功能。

查看Component Mover类,了解基本拖动组件的方法示例以及更复杂的拖动解决方案。