SWT: Neues TableItem mit TableEditor hinzufügen, bzw. Refresh erzwingen

melancoleeca

Grünschnabel
Guten Tag,

ich versuche momentan einen Table zu bauen dem zur Laufzeit neue Zeilen hinzugefügt werden können.

Das klappt eigentlich auch ganz gut.
Das Item/die Zeile wird an der gewünschten Stelle eingeschoben und auch die Controls der TableEditors werden korrekt entsprechend versetzt.

Leider wird aber kein Refresh erzwungen, das heißt die Auswirkungen werden erst sichtbar wenn der Table aus irgendeinem Grund neu gezeichnet wird.

Hier im Beispiel funktioniert der erste "Add" korrekt, da die Scrolebar erzeugt werden muss und dadurch ein refresh der Gui erzwungen wird.
Danach ist das von mir angesproche Verhalten zu beobachten.
Code:
package at.xy.test.smartclient;

import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TableEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

public class SWTTest {

	public static void main(String[] args) {
	    Display display = new Display();
	    Shell shell = new Shell(display);
	    Table table = new Table(shell, SWT.BORDER | SWT.MULTI);
	    table.setLinesVisible(true);
	    table.setHeaderVisible(true);
	    table.setSize(200, 200);
	    
	    addColumns(table);
	    for (int i = 0; i < 12; i++) {
              //erzeugen der ursprünglichen items
	      TableItem item = new TableItem(table, SWT.NONE);
	      item.setText(new String[]{"Item " + i,"_____"});
	      
	    }
	    
            //editors hinzufügen
	    addEditors(table);
	    
	    

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

	private static void addColumns(Table table) {
		TableColumn tc = new TableColumn(table,SWT.NULL);
		tc.setText("Name");
		tc.setWidth(100);
		tc = new TableColumn(table,SWT.NULL);
		tc.setText("And so");
		tc.setWidth(90);
	}

	private static void addEditors(final Table table) {
		for(TableItem item:table.getItems()){
			createEditor(table, item, false);

		}
		
	}
	protected static void createEditor(final Table table,TableItem item,boolean isNew){
		TableEditor editor = new TableEditor(table);
		Button button = new Button(table,SWT.PUSH);
		if(isNew){
			button.setText("-");
		}else{
			button.setText("+");
		}
		
		button.pack();
		button.setData("item",item);
		button.addSelectionListener(new SelectionListener(){

			public void widgetDefaultSelected(SelectionEvent e) {
			}

			public void widgetSelected(SelectionEvent e) {
                                //wenn auf einen button geklickt wird, wird unter dieser zeile eine neue erzeugt 
				Button button = (Button)e.widget;
				TableItem item = (TableItem)button.getData("item");
				int index = table.indexOf(item);
				
				addItem(table,index,item.getText(0));
				
			}
			
		});
		editor.minimumWidth=button.getSize().x;
		editor.setEditor(button,item,1);
		editor.layout();
	}

	protected static void addItem(final Table table, int index,String formerLabel) {
		
		TableItem item = new TableItem(table, SWT.NONE, index+1);
		item.setText(new String[]{formerLabel + "new","_____"});
		createEditor(table, item, true);

		
		
	}

}

Kann ich irgendwie einen Refresh der GUI erzwingen?
Sobald man im Table scrolled werden die Controls korrekt angezeigt. Das heißt es funktioniert, wird aber nicht gezeichnet :/

Eigentlich wirkt das Problem sehr trivial, aber ich komm einfach nicht dahinter wie ich es löse.
Ich hoffe hier hat jemand eine Idee.

mfg, melancoleeca
 
Zuletzt bearbeitet:
hallo ich habe so ein ähnliches Problem möchte aber ber Command also z.b. per Menu button meine Tabelle refreshen. Weis aber auch nicht wie ich auf den Modelviewer zugreifen kann damit die Tabelle refresht wird.
 
Zurück