私は、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()
アクセサーを追加して、カプセル化を解除するか、公開するメソッド/プロパティのパススルーメソッドを書き込みます(潜在的に多数)。私はここで欠けているいくつかの他の戦略はありますか?受け入れられたベストプラクティスは何ですか?私はマウスを使ってコンポーネントを再配置可能な
ここに「JPanel」を拡張しても何の問題もありません。 –
*「スイングの構成要素を拡張するべきではないと私は数多くのポスターを主張しています」*石に彫られたものではなく、「一般的なルール」であると指摘する。 ***は、コンポーネントを拡張することが意味を成す有効なケースです(カスタムペイントなど)。 * "..絶対配置(レイアウトマネージャなし)で、マウスでコンポーネントの位置を変更することができます" * ..why?私はこれがGUIデザイナーを作ろうとする試みではないことを願っています。なぜなら、結果として生じるGUIは、通常、レイアウトなしで作られたGUIに課されるすべての問題を持つからです。 .. –
..しかし、実際にD'n'Dパネルのために良いケースであることが判明した場合は、少なくともDragAndDropLayoutを実装することを強くお勧めします。それで間違っています。 –