2017-06-07 7 views
0

Ich habe ein Textfeld und eine Schaltfläche zum Hinzufügen daneben, wenn ich auf die Schaltfläche Hinzufügen klicke, kann ich ein Textfeld hinzufügen und die Schaltfläche daneben löschen. Jetzt möchte ich, dass die Schaltfläche "Hinzufügen" in der ersten Zeile geändert wird und die Schaltfläche "Hinzufügen" unter zwei Zeilen neu positioniert wird. Wenn Sie auf die Schaltfläche zum Löschen der zweiten Zeile klicken, wird die Schaltfläche "Hinzufügen" wieder angezeigt die erste Zeile und ersetzen Sie die Schaltfläche zum Löschen. Es sollte wie folgt aussehen.Wie man eine Taste ersetzt und dynamisch neu positioniert?

enter image description here

enter image description here

Wie das ich erreichen?

Antwort

0

Wenn Sie einen Composite als einen Container von Arten erstellen, können Sie hinzufügen und entfernen, alles außerhalb in der richtigen Reihenfolge zu bleiben. Durch das Reservieren des Speicherplatzes befindet sich die Schaltfläche zum Löschen immer unter dem Inhalt des Containers.

Ich habe ein Textfeld und eine Schaltfläche Hinzufügen daneben, wenn ich auf Schaltfläche Hinzufügen ich in der Lage bin ein Textfeld hinzuzufügen und löschen Schaltfläche daneben

Zum Beispiel, wenn wir haben einen kleinen Shell mit einem Add Button wie Sie erwähnt haben, und einen leeren Raum, um die Text Widgets hinzuzufügen:

final Composite baseComposite = new Composite(shell, SWT.BORDER); 
baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
baseComposite.setLayout(new GridLayout()); 

final Composite rowsContainerComposite = new Composite(baseComposite, SWT.BORDER); 
rowsContainerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
rowsContainerComposite.setLayout(new GridLayout()); 

final Button addButton = new Button(baseComposite, SWT.PUSH); 
addButton.setText("Add"); 

enter image description here

(Vorerst der leere Raum, alle verfügbaren Raum greifen, aber man kann sich ändern, dass je nach Bedarf)

Wenn Zeilen hinzufügen, Sie zum rowsContainerComposite hinzufügen:

addButton.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(final SelectionEvent e) { 
     new Row(rowsContainerComposite); 
     rowsContainerComposite.layout(); 
    } 
}); 

Eine Probe Klasse :

public class Row { 

    final Composite baseComposite; 

    public Row(final Composite parent) { 
     baseComposite = new Composite(parent, SWT.BORDER); 
     baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); 
     baseComposite.setLayout(new GridLayout(2, false)); 

     final Text text = new Text(baseComposite, SWT.BORDER); 
     text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

     final Button deleteButton = new Button(baseComposite, SWT.PUSH); 
     deleteButton.setText("Delete"); 
     deleteButton.addSelectionListener(new SelectionAdapter() { 

      @Override 
      public void widgetSelected(final SelectionEvent e) { 
       baseComposite.dispose(); 
       parent.layout(); 
      } 

     }); 
    } 

} 

enter image description here

wenn die zweite Reihe Schaltfläche Löschen geklickt wird (die zweite Zeile gelöscht wird) die Schaltfläche Hinzufügen

Dann zurück in die erste Reihe gehen sollte, wenn gelöscht, Zeilen werden wieder entsprechend verschieben:

enter image description here

die Schaltfläche hinzufügen unter zwei Reihen werden sollte, ist

neu positioniert

die Idee, dass b Wenn Sie den Verbund "Container" verwenden, reservieren Sie den Speicherplatz, zu dem Sie die Zeilen hinzufügen und daraus entfernen möchten. Die Schaltfläche zum Löschen befindet sich immer unterhalb der Zeilen, wenn sie hinzugefügt und entfernt werden.


Voll Beispiel:

public class AddDeleteButtonTest { 

    private static class Row { 

     final Composite baseComposite; 

     public Row(final Composite parent) { 
      baseComposite = new Composite(parent, SWT.BORDER); 
      baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); 
      baseComposite.setLayout(new GridLayout(2, false)); 

      final Text text = new Text(baseComposite, SWT.BORDER); 
      text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 

      final Button deleteButton = new Button(baseComposite, SWT.PUSH); 
      deleteButton.setText("Delete"); 
      deleteButton.addSelectionListener(new SelectionAdapter() { 

       @Override 
       public void widgetSelected(final SelectionEvent e) { 
        baseComposite.dispose(); 
        parent.layout(); 
       } 

      }); 
     } 

    } 

    private final Display display; 
    private final Shell shell; 

    public AddDeleteButtonTest() { 
     display = new Display(); 
     shell = new Shell(display); 
     shell.setLayout(new FillLayout()); 

     final Composite baseComposite = new Composite(shell, SWT.BORDER); 
     baseComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
     baseComposite.setLayout(new GridLayout()); 

     final Composite rowsContainerComposite = new Composite(baseComposite, SWT.BORDER); 
     rowsContainerComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); 
     rowsContainerComposite.setLayout(new GridLayout()); 

     final Button addButton = new Button(baseComposite, SWT.PUSH); 
     addButton.setText("Add"); 
     addButton.addSelectionListener(new SelectionAdapter() { 

      @Override 
      public void widgetSelected(final SelectionEvent e) { 
       new Row(rowsContainerComposite); 
       rowsContainerComposite.layout(); 
      } 

     }); 
    } 

    public void run() { 
     shell.setSize(200, 200); 
     shell.open(); 

     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 

    public static void main(final String... args) { 
     new AddDeleteButtonTest().run(); 
    } 

} 
+0

Danke avojak, aber ich brauche etwas, wie oben Bilder – user04556

+1

@ user7999545 ​​erwähnt Diese hübsche viel antwortet, was Sie gefragt haben, wir sind nicht hier, um Ihnen den genauen Code zu geben, um Ihr Bild zu replizieren. Das Formatieren von Text und Schaltflächen liegt außerhalb des Bereichs Ihrer Frage. –

+0

@ user7999545 ​​Diese Bilder waren nicht Teil Ihrer Frage, als ich antwortete, und wie Greg sagte, werde ich nicht Ihren ganzen Code für Sie schreiben. Sie sollten in der Lage sein, einem nahezu identischen Ansatz zu folgen, um zu bekommen, was Sie wollen. – avojak

0

tat ich das gleiche in einem meinem Projekt. Der Code ist in Jface/SWT etwas kompliziert. Das Hinzufügen und Entfernen von Widgets in Composite-Umgebungen ist eine etwas schwere Aufgabe. Dies verringert die Leistung der Benutzeroberfläche.

Wenn Sie Jface tableviewer anstelle von Composite verwenden, erhalten Sie eine bessere UI-Leistung und ein gutes Aussehen. In der Tabellenansicht in einer Spalte können Sie Textfelder anzeigen und in einer Spalte Schaltflächen anzeigen. Sie können die Tabellenspalte Editing support/label providers schreiben, um die Schaltflächen anzuzeigen.

Mit diesem Ansatz können Sie Schaltflächen für alle Zeilen anzeigen oder wenn Sie auf eine beliebige Zelle klicken, die Sie hinzufügen oder löschen möchten.

Ich kann den Code-Schnipsel teilen jetzt, aus irgendwelchen Gründen, aber wenn Sie, dass ich es brauchen am Wochenende teilen

Verwandte Themen