SWT - Tree in SashForm - Aktualisierung Context-Seite

marstek

Grünschnabel
Hallo zusammen,

ich bin eigentlich auch noch ein "Anfänger" hab aber mit Java, Eclipse und SWT schon ein bisschen rumgemacht. Die Snippets auf der Eclipse-Homepage, usw, habe ich auch schon mal durchgemacht und eigentlich auch gut verstanden.

Ich habe aber jetzt (wahrscheinlich ein kleineres) Problem:

Ich habe ein Programm mit einer SashForm in der Shell, d.h. der Bildschirm ist bei mir vertikal zweigeteilt. Im linken Teil der SashForm habe ich einen Tree (das soll mein Menüsystem sein) erstellt. In der rechten Seite der SashForm soll nun, je nachdem welcher Tree-Eintrag ausgewählt wurde der entsprechende Context angezeigt werden (z.B. mal eine Adresserfassung, mal eine Mitarbeitererfassung, usw.)

Ich habe nun auf den Tree eine Listener gelegt und kann das ausgewählte Tree-Item auch feststellen. Mir geht es jetzt eigentlich darum, wie ich die Anzeige im Linken Teil der SashForm aktualisieren/ändern kann. Obohl ich immer die Composite in diesem linken Teil dispose() und neu reinmache klappt das nicht.

Ich hoffe mir kann hier jemand einen kurzen Tipp geben.

Danke im Voraus
marstek
 
Hallo!

Schau mal hier:
Java:
/**
 *
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * @author Tom
 * 
 */
public class SWTReplaceComponentInSashExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("SWTReplaceComponentInSashExample");

        shell.setLayout(new FillLayout());

        SashForm sashForm = new SashForm(shell, SWT.NONE);
        Composite leftComposite = new Composite(sashForm, SWT.NONE);
        leftComposite.setLayout(new GridLayout(1, false));
        final Composite rightComposite = new Composite(sashForm, SWT.NONE);
        rightComposite.setLayout(new FillLayout());

        final Button btnShowText = new Button(leftComposite, SWT.PUSH);
        btnShowText.setText("Show text");

        final Button btnShowCombo = new Button(leftComposite, SWT.PUSH);
        btnShowCombo.setText("show combo");

        // initial: show a textfield
        createTextFor(rightComposite, "ABC");

        SelectionListener selectionListener = new SelectionAdapter() {
            public void widgetSelected(SelectionEvent selectionEvent) {
                if (selectionEvent.getSource() == btnShowText) {
                    rightComposite.getChildren()[0].dispose();
                    createTextFor(rightComposite, "ABC");
                    rightComposite.layout();
                } else if (selectionEvent.getSource() == btnShowCombo) {
                    rightComposite.getChildren()[0].dispose();
                    createComboFor(rightComposite, new String[] { "ABC", "DEF",
                            "GHI" });
                    rightComposite.layout();
                }
            }
        };

        btnShowText.addSelectionListener(selectionListener);
        btnShowCombo.addSelectionListener(selectionListener);

        shell.pack();
        shell.open();

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

    protected static Control createComboFor(Composite parent, String[] strings) {
        Combo combo = new Combo(parent, SWT.NONE);
        combo.setItems(strings);
        return combo;
    }

    private static Control createTextFor(Composite parent, String string) {
        Text text = new Text(parent, SWT.NONE);
        text.setText(string);
        return text;
    }
}

Gruß Tom
 
Hallo zusammen,

nochmal Danke an Tom für die schnelle Antwort. Funktioniert wunderbar. Mein Fehler war, dass ich immer das ganze rightComposite disposed habe und nicht nur die einzelnen Children, die dort drinnen waren.

Gruß
marstek
 
Hallo,

danke erstmal an Thomas fuer das schoene Beispiel. Ich bin auf der Suche nach einer Loesung fuer oben genanntes Problem auf diesen Thread gestossen.

Ich habe bei mir jetzt aber das Problem, dass ich es nicht schaffe fuer ein TreeItem einen SelectionListener zu registrieren. Im Beispiel verwendet Thomas ja Buttons und Combos.

Weiss jemand, wie das mit Trees und TreeItems zu realisieren ist?

PS: Ich steh grad ziemlich auf dem Schlauch, da ich schon 9h hier sitze und progge, man verzeihe mir also bitte, wenn ich das offensichtliche gerade uebersehe. :)
 
Hallo!

Schau mal hier:
Java:
/**
 *
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;

/**
 * @author Tom
 * 
 */
public class SWTReplaceComponentInSashExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("SWTReplaceComponentInSashExample");

        shell.setLayout(new FillLayout());

        SashForm sashForm = new SashForm(shell, SWT.NONE);
        Composite leftComposite = new Composite(sashForm, SWT.NONE);
        leftComposite.setLayout(new FillLayout());
        final Composite rightComposite = new Composite(sashForm, SWT.NONE);
        rightComposite.setLayout(new FillLayout());

        // initial: show a textfield
        createTextFor(rightComposite, "ABC");

        
        Tree tree = new Tree(leftComposite, SWT.NONE);
        createTreeStructure(tree);
        tree.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                TreeItem treeItem = (TreeItem) e.item;
                if ("combo".equalsIgnoreCase(treeItem.getText())) {
                    rightComposite.getChildren()[0].dispose();
                    createComboFor(rightComposite, new String[] { "ABC", "DEF",
                            "GHI" });
                } else if ("text".equalsIgnoreCase(treeItem.getText())) {
                    rightComposite.getChildren()[0].dispose();
                    createTextFor(rightComposite, "ABC");
                }
                rightComposite.layout();
            }
        });

        shell.pack();
        shell.open();

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

    private static void createTreeStructure(Tree tree) {
        TreeItem root = new TreeItem(tree, SWT.NONE);
        root.setText("root");
        TreeItem treeItem = new TreeItem(root, SWT.NONE);
        treeItem.setText("combo");
        treeItem = new TreeItem(root, SWT.NONE);
        treeItem.setText("text");
    }

    protected static Control createComboFor(Composite parent, String[] strings) {
        Combo combo = new Combo(parent, SWT.NONE);
        combo.setItems(strings);
        return combo;
    }

    private static Control createTextFor(Composite parent, String string) {
        Text text = new Text(parent, SWT.NONE);
        text.setText(string);
        return text;
    }
}

Gruß Tom
 
Zurück