SWT проблема с вложенным составным макетом - PullRequest
2 голосов
/ 16 января 2010

Я новичок в SWT, но у меня большой опыт работы с другими менеджерами компоновки графического интерфейса. Я столкнулся со странной проблемой при вложении композита внутри другого композита.

enter image description here

http://www.swooby.com/swt/nestedcontrolproblem.png

Если я запускаю аудиоконтроль как отдельный компонент, он работает нормально.

Если я запускаю его в другом композите, он начинает выглядеть забавно.

Когда я добавляю этот композит к более сложному родительскому элементу (6 столбцов), кажется, что вложенный композит не обрабатывает собственный горизонтальный промежуток, определенный классом.

Аудиоконтроль отлично размещается в менее сложном родительском элементе (всего 2 столбца).

Я использую Eclipse Visual Editor для их размещения, поэтому я не написал никакого собственного кода для изменения макета (кроме как для изменения типа Composite на CompositeAudio).

Код для воспроизведения: Parent.java

package com.twistpair.qa;

import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;

public class Parent extends Composite {

    private AudioControl compositeAudio = null;

    public Parent(Composite parent, int style) {
        super(parent, style);
        initialize();
    }

    private void initialize() {
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        this.setLayout(gridLayout);
        createCompositeAudio();
        setSize(new Point(97, 673));
    }

    /**
     * This method initializes compositeAudio   
     *
     */
    private void createCompositeAudio() {
        GridData gridData = new GridData();
        gridData.horizontalAlignment = GridData.CENTER;
        gridData.grabExcessHorizontalSpace = false;
        gridData.grabExcessVerticalSpace = false;
        gridData.horizontalSpan = 2;
        gridData.verticalAlignment = GridData.CENTER;
        compositeAudio = new AudioControl(this, SWT.NONE);
        compositeAudio.setLayout(new GridLayout());
        compositeAudio.setLayoutData(gridData);
    }

}  //  @jve:decl-index=0:visual-constraint="36,7"

AudioControl.java:

package com.twistpair.qa;

import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.widgets.Display;

public class AudioControl extends Composite {

    private CLabel cLabelAudio = null;
    private Button checkBoxRunning = null;
    private CLabel cLabelVolume = null;
    private Scale scaleVolumeLeft = null;
    private CLabel cLabelVuMeter = null;
    private Canvas canvasVuMeterLeft = null;
    private Button checkBoxMuteRx = null;
    private Button checkBoxMuteTx = null;
    private Button checkBoxMuteBoth = null;
    private Scale scaleVolumeRight = null;
    private Canvas canvasVuMeterRight = null;

    public AudioControl(Composite parent, int style) {
        super(parent, style);
        initialize();
    }

    private void initialize() {
        GridData gridData31 = new GridData();
        gridData31.horizontalAlignment = GridData.CENTER;
        gridData31.verticalAlignment = GridData.CENTER;
        GridData gridData21 = new GridData();
        gridData21.horizontalAlignment = GridData.CENTER;
        gridData21.verticalAlignment = GridData.CENTER;
        GridData gridData11 = new GridData();
        gridData11.horizontalSpan = 2;
        GridData gridData5 = new GridData();
        gridData5.horizontalSpan = 2;
        gridData5.verticalAlignment = GridData.CENTER;
        gridData5.horizontalAlignment = GridData.CENTER;
        GridData gridData4 = new GridData();
        gridData4.horizontalSpan = 2;
        gridData4.verticalAlignment = GridData.CENTER;
        gridData4.horizontalAlignment = GridData.CENTER;
        GridData gridData3 = new GridData();
        gridData3.horizontalSpan = 2;
        gridData3.verticalAlignment = GridData.CENTER;
        gridData3.horizontalAlignment = GridData.CENTER;
        GridData gridData2 = new GridData();
        gridData2.horizontalSpan = 2;
        GridData gridData1 = new GridData();
        gridData1.horizontalSpan = 2;
        GridData gridData = new GridData();
        gridData.horizontalSpan = 2;
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        cLabelAudio = new CLabel(this, SWT.NONE);
        cLabelAudio.setText("Audio");
        cLabelAudio.setFont(new Font(Display.getDefault(), "Segoe UI", 9, SWT.BOLD));
        cLabelAudio.setLayoutData(gridData5);
        checkBoxRunning = new Button(this, SWT.CHECK);
        checkBoxRunning.setText("Running");
        checkBoxRunning.setLayoutData(gridData11);
        cLabelVolume = new CLabel(this, SWT.NONE);
        cLabelVolume.setText("Volume");
        cLabelVolume.setFont(new Font(Display.getDefault(), "Segoe UI", 9, SWT.BOLD));
        cLabelVolume.setLayoutData(gridData4);
        scaleVolumeLeft = new Scale(this, SWT.VERTICAL);
        scaleVolumeLeft.setLayoutData(gridData21);
        scaleVolumeRight = new Scale(this, SWT.VERTICAL);
        scaleVolumeRight.setLayoutData(gridData31);
        cLabelVuMeter = new CLabel(this, SWT.NONE);
        cLabelVuMeter.setText("VU Meter");
        cLabelVuMeter.setFont(new Font(Display.getDefault(), "Segoe UI", 9, SWT.BOLD));
        cLabelVuMeter.setLayoutData(gridData3);
        createCanvasVuMeterLeft();
        this.setLayout(gridLayout);
        this.setSize(new Point(151, 415));
        createCanvasVuMeterRight();
        checkBoxMuteRx = new Button(this, SWT.CHECK);
        checkBoxMuteRx.setText("Mute RX");
        checkBoxMuteRx.setLayoutData(gridData);
        checkBoxMuteTx = new Button(this, SWT.CHECK);
        checkBoxMuteTx.setText("Mute TX");
        checkBoxMuteTx.setLayoutData(gridData1);
        checkBoxMuteBoth = new Button(this, SWT.CHECK);
        checkBoxMuteBoth.setText("Mute Both");
        checkBoxMuteBoth.setLayoutData(gridData2);
    }

    /**
     * This method initializes canvasVuMeterLeft    
     *
     */
    private void createCanvasVuMeterLeft() {
        canvasVuMeterLeft = new Canvas(this, SWT.BORDER);
    }

    /**
     * This method initializes canvasVuMeterRight   
     *
     */
    private void createCanvasVuMeterRight() {
        canvasVuMeterRight = new Canvas(this, SWT.BORDER);
    }

}  //  @jve:decl-index=0:visual-constraint="10,10"

Моя другая проблема заключалась в том, что аудиоконтроль изначально содержал три флажка «Без звука» под двумя холстами VU (левый / правый). В менее сложных родительских объектах макет в основном работал, но три флажка под холстами VU не создавались. Я использовал шпионскую программу для просмотра работающего пользовательского интерфейса, и элементы управления действительно отсутствовали. В коде действительно были допустимые объекты, которыми я мог манипулировать. Я думал, что это странно, и, кажется, временно решил проблему, просто переместив флажки, но я думаю, что это может быть индикатором того, что что-то не так с моим аудиоконтролем.

Кто-нибудь видел что-нибудь подобное этим двум проблемам? Я искал в сети и stackoverflow и не видел ничего, что напрямую связано.

Спасибо!

Pv

...