SWT Composite - neu zeichnen Problem
-
06-07-2019 - |
Frage
Ich habe ein Verbundelement, die zunächst ein Label hat. Jetzt rufe ich die darüber verfügen (das Etikett) und ein weiteres Label im gleichen Behälter (Composite Ulme) schaffen, aber ich weiß nicht den neuen Text sehen. Es bringt mich zu fragen, wie ich auf dem Verbundfreigabe neu zu zeichnen, so dass das neue Label (oder jede andere Komponente I schaffen könnte) anstelle der alten machen wird. Hier ist der Code Ich habe (in eine Einheit Test getrennt zur Herstellung eines Verbund neu gezeichnet)
private Label createLabel( Composite parent) {
Label label = new Label(parent, SWT.NONE);
label.setAlignment(SWT.CENTER);
label.setLayoutData( new GridData( SWT.CENTER, SWT.CENTER, true, true) );
return label;
}
private void changeText() {
assert testCell != null : "Please initialize test cell";
testCell.getChildren()[0].dispose();
Label l = createLabel(testCell);
l.setText("New TexT");
testCell.redraw();
}
private void draw() {
Display display = new Display();
shell = new Shell(display);
shell.setLayout(new GridLayout(2,false));
testCell = new Composite(shell,SWT.BORDER);
testCell.setLayout(new GridLayout());
Label l = createLabel(testCell);
l.setText("Old Text");
Composite btnCell = new Composite(shell,SWT.NONE);
btnCell.setLayout(new GridLayout());
Button b = new Button(btnCell, SWT.PUSH);
b.setText("Change");
b.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event e) {
changeText();
}
});
Wie Sie sehen können, habe ich auf dem Verbund neu zeichnen nenne, nachdem ich ein neues Element hinzuzufügen. Außerdem habe ich festgestellt, dass nach dem Aufruf zu entsorgen, testCell.getChildren (). Länge 0 zurück, wie erwartet, und wenn ich ein neues Label zu erstellen, bekomme ich den gleichen Ausdruck 1 zurückzukehren, Verifizieren, dass das neue Element in der Tat wird immer zu seinem übergeordneten Behälter aus Verbundstoff hinzugefügt Bin ich etwas fehlt hier?
Lösung
In der changeText()
Funktion, die
testCell.redraw();
Zeile ersetzt werden sollte
testCell.layout();
Oder, wenn Sie es ändern möchten korrekt sollten Sie verwenden
shell.layout();
.
Andere Tipps
würde ich sagen, ein Selection auf dem Etikett hinzuzufügen.
.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e) {
//Change text by Label.setText();
}
}