1

円や長方形などの中央のサイズ変更可能な形状と、下部の編集可能なラベルの 2 つの部分で構成される Draw2D Figure を作成しようとしています。このタイプの図の例は、コンピュータのデスクトップに表示されるアイコン/ラベルです。

最初の試みは、2 つの子サブフィギュア (中央に配置された形状フィギュアと下部に配置されたラベル) を持つ親コンテナー フィギュアを作成することでした。また、HandleBounds を実装して、選択とサイズ変更が上部の形状サブフィギュアでのみ発生するようにしました。これは有効な解決策ではないことが判明しました。これは、テキストが増えるとラベルが広くなり、メインの親図とその結果として中央の形状の図も大きくなるためです。つまり、全体的な親 Figure は、子ラベル Figure と同じ幅です。

私が求めているのは、形状の図のサイズを維持しながら、ラベルの図の幅を個別に拡大できる図です。デスクトップ アイコンとまったく同じ動作です。

4

2 に答える 2

2

わかりました、今すぐ質問を承ります。あなたが望むことをすることは不可能です:

親の Figure は、その子の 1 つよりも小さくすることはできません。そうしないと、この子は表示されません !!!

于 2011-03-15T16:56:27.793 に答える
0

XYLayout で述べたようにコンテナー図を作成し、IFigure.add(IFigure child, Object constraint)Rectangle (Draw2d) タイプの Constraint のメソッドを使用して、このレイアウト内に 2 つ (形状とラベル) の子図を「手動で」配置して「サイズ変更」する必要があります。

コードサンプルで編集

Figure クラスがどのように見えるかの例を次に示します。

package draw2dtest.views;

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Ellipse;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.FigureListener;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.draw2d.MouseEvent;
import org.eclipse.draw2d.MouseListener;
import org.eclipse.draw2d.XYLayout;
import org.eclipse.draw2d.geometry.Rectangle;

public class LabeledFigure extends Figure {

    private final Figure shapeFigure;
    private final Label labelFigure;
    private Rectangle customShapeConstraint;

    public LabeledFigure(String label) {
        setLayoutManager(new XYLayout());
        setBackgroundColor(ColorConstants.lightGray);
        setOpaque(true);

        shapeFigure = new Ellipse();
        this.add(shapeFigure);
        shapeFigure.setBackgroundColor(ColorConstants.yellow);

        shapeFigure.addMouseListener(new MouseListener.Stub() {
            @Override
            public void mousePressed(MouseEvent me) {
                customShapeConstraint = new Rectangle(
                        (Rectangle) LabeledFigure.this.getLayoutManager()
                                .getConstraint(shapeFigure));
                customShapeConstraint.width -= 6;
                customShapeConstraint.x += 3;
                LabeledFigure.this.getLayoutManager().setConstraint(
                        shapeFigure, customShapeConstraint);
                LabeledFigure.this.revalidate();
            }
        });

        labelFigure = new Label(label);
        labelFigure.setOpaque(true);
        labelFigure.setBackgroundColor(ColorConstants.green);
        labelFigure.addMouseListener(new MouseListener.Stub() {
            @Override
            public void mousePressed(MouseEvent me) {
                Rectangle shapeFigureConstraint = new Rectangle(0, 0,
                        bounds.width, bounds.height - 15);
                LabeledFigure.this.getLayoutManager().setConstraint(
                        shapeFigure, shapeFigureConstraint);
                LabeledFigure.this.revalidate();
            }
        });
        this.add(labelFigure);

        this.addFigureListener(new FigureListener() {

            @Override
            public void figureMoved(IFigure source) {

                Rectangle bounds = LabeledFigure.this.getBounds();
                Rectangle shapeFigureConstraint = new Rectangle(0, 0,
                        bounds.width, bounds.height - 15);
                LabeledFigure.this.getLayoutManager().setConstraint(
                        shapeFigure, shapeFigureConstraint);

                Rectangle labelFigureConstraint = new Rectangle(0,
                        bounds.height - 15, bounds.width, 15);
                if (customShapeConstraint != null) {
                    labelFigureConstraint = customShapeConstraint;
                }
                LabeledFigure.this.getLayoutManager().setConstraint(
                        labelFigure, labelFigureConstraint);
            }
        });
    }
}

これはきれいなクラスではありませんが、目標を達成する方法を示すには良いエントリーになるはずです。これは、Gef コードを使用しない純粋な Draw2d に基づく例です。したがって、形状のサイズ変更は、黄色の楕円 (サイズが縮小されます) と緑色のラベル (初期サイズが復元されます) をクリックすることによって行われます。

このクラスをテストするために、次のような単純な Eclipse ビューを作成しました。

@Override
public void createPartControl(Composite parent) {

    FigureCanvas fc = new FigureCanvas(parent, SWT.DOUBLE_BUFFERED);
    fc.setBackground(ColorConstants.red);

    Panel panel = new Panel();
    panel.setLayoutManager(new XYLayout());

    LabeledFigure labeledFigure = new LabeledFigure("This is the label");
    fc.setContents(panel);

    panel.add(labeledFigure, new Rectangle(10,10, 200,100));
}

これが役に立てば幸いです、マヌ

于 2011-03-15T14:20:55.287 に答える