Я новичок в SWT, но у меня большой опыт работы с другими менеджерами компоновки графического интерфейса.
Я столкнулся со странной проблемой при вложении композита внутри другого композита.
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