簡體   English   中英

如何不擴展Swing組件?

[英]How to NOT extend Swing components?

我已經看到許多張貼者認為不應擴展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()訪問器,該訪問器將破壞封裝,或者為getPanel()編寫傳遞方法。我要公開的JPanel方法/屬性(可能很多)。 我在這里還缺少其他一些策略嗎? 什么是公認的最佳實踐?

在其中可以用鼠標重新放置組件:

然后,只需將MouseListener/MouseMotionListener添加到要拖動的組件。 無需擴展任何組件即可添加該功能。

請查看Component Mover類,以獲取對組件進行基本拖動的方法示例以及更復雜的拖動解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM