2016-12-15 6 views
0

私は、Swingコンポーネントを拡張するべきではなく、代わりにその機能を合成を介して追加するべきであると数多くのポスターを見てきました。だから私はreusably私はマウスを使ってコンポーネントを再配置可能な絶対位置(無レイアウトマネージャ)とJPanelを作成したいと言う:Swingコンポーネントを拡張しない方法は?

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()アクセサーを追加して、カプセル化を解除するか、公開するメソッド/プロパティのパススルーメソッドを書き込みます(潜在的に多数)。私はここで欠けているいくつかの他の戦略はありますか?受け入れられたベストプラクティスは何ですか?私はマウスを使ってコンポーネントを再配置可能な

+1

ここに「JPanel」を拡張しても何の問題もありません。 –

+1

*「スイングの構成要素を拡張するべきではないと私は数多くのポスターを主張しています」*石に彫られたものではなく、「一般的なルール」であると指摘する。 ***は、コンポーネントを拡張することが意味を成す有効なケースです(カスタムペイントなど)。 * "..絶対配置(レイアウトマネージャなし)で、マウスでコンポーネントの位置を変更することができます" * ..why?私はこれがGUIデザイナーを作ろうとする試みではないことを願っています。なぜなら、結果として生じるGUIは、通常、レイアウトなしで作られたGUIに課されるすべての問題を持つからです。 .. –

+1

..しかし、実際にD'n'Dパネルのために良いケースであることが判明した場合は、少なくともDragAndDropLayoutを実装することを強くお勧めします。それで間違っています。 –

答えて

1

を次に、あなたはちょうどあなたがドラッグするコンポーネントにMouseListener/MouseMotionListenerを追加します。その機能を追加するためにコンポーネントを拡張する必要はありません。

コンポーネントを基本的にドラッグする方法や、より複雑なドラッグソリューションの例については、Component Moverクラスをご覧ください。

+0

うわー、そうです。私はそのように考えなかった。この機能を特定のコンテナタイプにバインドする必要はありません。そうでない場合は、より柔軟性があります。 ComponentMoverはそれを美しく示しています。ありがとう! –

関連する問題