I have created a class by subclassing SWT Canvas. The class (SceneImage) contains two standard SWT Widgets:
Image Label
The class code follows:
class SceneImage extends Canvas { private int sceneNumber; private IFrame sceneFrame; private Image sceneImage; private Label sceneLabel; /** * @param parent * @param style */ public SceneImage(Composite parent, int style, IFrame sceneFrame, int sceneNumber) { super(parent, style); this.sceneFrame = sceneFrame; this.sceneImage = new Image(parent.getDisplay(), sceneFrame.getFrameImage());; this.sceneLabel = new Label(parent, style); this.sceneLabel.setText("Scene: " + sceneNumber); Rectangle imageBounds = this.sceneImage.getBounds(); Rectangle labelBounds = this.sceneLabel.getBounds(); this.sceneLabel.setBounds(imageBounds.x + 5, imageBounds.y + 5, labelBounds.width, labelBounds.height); this.sceneNumber = sceneNumber; // It is a SWT convention to use anonymous inner classes to forward // functionality to non-public methods of the same name. addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { SceneImage.this.widgetDisposed(e); } }); addPaintListener(new PaintListener() { public void paintControl(PaintEvent e) { SceneImage.this.paintControl(e); } }); addMouseListener(new MouseAdapter() { public void mouseUp(MouseEvent e) { SceneImage.this.mouseUp(e); } }); } // End public SceneImage(Composite parent, int style, ........... /** * @return the preferred size of the SceneImage */ public Point computeSize(int wHint, int hHint, boolean changed) { int width = 0, height = 0; if (sceneImage != null) { Rectangle bounds = sceneImage.getBounds(); width = bounds.width; height = bounds.height; log_debug("sceneImage: " + getSceneNumber() + " width = " + width); log_debug("sceneImage: " + getSceneNumber() + " height = " + height); } if (sceneLabel != null) { Rectangle bounds = sceneLabel.getBounds(); //width += bounds.width; //height += bounds.height; log_debug("sceneLabel: " + getSceneNumber() + " width = " + bounds.width); log_debug("sceneLabel: " + getSceneNumber() + " height = " + bounds.height); } if (wHint != SWT.DEFAULT) { width = wHint; log_debug("wHint != SWT.DEFAULT. Width has been changed to wHint: " + wHint); } if (hHint != SWT.DEFAULT) { height = hHint; log_debug("hHint != SWT.DEFAULT. Height has been changed to hHint: " + hHint); } return new Point(width + 2, height + 2); } /** * @return the sceneFrame */ public IFrame getSceneFrame() { return sceneFrame; } /** * @return the sceneImage */ public Image getSceneImage() { return sceneImage; } /** * @return the sceneLabel */ public Label getSceneLabel() { return sceneLabel; } /** * @return the sceneNumber */ public int getSceneNumber() { return sceneNumber; } public void highLightSceneLabelForeground() { org.eclipse.swt.graphics.Color color = getMyDisplay().getSystemColor (SWT.COLOR_RED); getSceneLabel().setForeground(color); redraw(); } public void removeSceneLabelForegroundHighlighting() { getSceneLabel().setForeground(null); redraw(); } /** * @param sceneFrame the sceneFrame to set */ public void setSceneFrame(IFrame sceneFrame) { this.sceneFrame = sceneFrame; } /** * @param sceneImage the sceneImage to set */ public void setSceneImage(Image sceneImage) { this.sceneImage = sceneImage; } /** * @param sceneLabel the sceneLabel to set */ public void setSceneLabel(Label sceneLabel) { this.sceneLabel = sceneLabel; } /** * @param sceneNumber the sceneNumber to set */ public void setSceneNumber(int sceneNumber) { this.sceneNumber = sceneNumber; } private void mouseUp(MouseEvent e) { getSceneFrame().getVideo().setCurrentFrame(getSceneFrame() .getFrameNumber()); } private void paintControl(PaintEvent e) { if (getSceneImage() != null) { getSceneImage().dispose(); setSceneImage(hugImageAndCanvasSizes(this, getSceneFrame())); e.gc.drawImage(getSceneImage(), 0, 0); } } private void widgetDisposed(DisposeEvent e) { if (null != getSceneImage()) { getSceneImage().dispose(); } if (null != getSceneLabel()) { getSceneLabel().dispose(); } } }
I want the Label displayed (centered) under it's associated image.
I generate n number of these SceneImage objects. I display them in a ScrolledComposite using GridLayout. What gets displayed is image 1 then to it's right label 1, etc.
How can I get the objects displayed the way I want in SWT?
Is there a way I can get GridLayout to see my SceneObject as one Widget instead of two?
Or is it a matter of instructing GridLayout to display the two Widgets the way I want? If yes, then how?
Should I be using a different Layout Manager to accomplish this?
Thanks for your assistance.