# Nerviges Gepiepe beim Nutzen von KeyListenern & Scrollbare Composites



## dzim (14. Aug 2009)

Hallo zusammen,

ich musste heute nach einiger Zeit SWT-Abstinenz einige recht nervige "Features" mich mit zwei nervigen Problem rumärgern:

1) Wenn ich einen KeyListener an eine Liste (oder Tabelle, das ist in dem Fall ja egal) ranhänge, fängt bei den abgefangen Key-Events (hier das Nutzen der Entfernen-Taste in einer Liste) der Speaker an unter Linux ein nettes "PIEP" von sich zu geben... 
Die Frage ist: Wieso? Und: Wie bekomm ich das weg?

2) Scrollbare Composites... Also mal ehrlich, das ist doch ein "pain in the ass"!
Ich habe eine Composite-Klasse, die in ein TabItem geladen wird, wessen TabFolder wiederum in einer Group sitzt - kling jetzt vielleicht recht übertrieben, macht es aber recht übersichtlich.
Jetzt ist es potentiell so, das er Inhalt meiner eigenen Composite-Klasse etwas größer werden kann, als die Fläche, die mir in der Group zur Verfügung steht, da wollte ich jetzt vertikales scrollen zulassen. SWT.V_SCROLL ist definitv nicht sehr hilfreich (jedenfalls unter GTK nicht), wenn man es an das Composite beim Start übergibt. Es erscheint dann zwar ein Scrollbalken, der aber nicht das Composite tatsächlich scrollt - oder ich stell mich zu dämlich an. Es an das TabItem, den TabFolder oder die Group zu ebergeben bringt scheinbar auch nichrs.
ScrollableComposite, dachte ich, könnte die Lösung sein. Leider zeigt das auch nach einigem Versuchen nichts an. Das Composite bleibt dann immer komplett leer. Das hier >> Java Tips - How to make View scrollable in SWT << hat mir da nicht weitergeholfen... Ich habe es über eine Zwischenklasse versucht, der ich das andere Composite gegeben hab.

```
public class SingleReportConfigScrolledComposite extends ScrolledComposite {

	public SingleReportConfigScrolledComposite(Composite parent, int style,
			SingleReportConfig reportConfig) {

		super(parent, style | SWT.BORDER | SWT.V_SCROLL);

		SingleReportConfigComposite content = new SingleReportConfigComposite(
				this, style, reportConfig);

		setContent(content); // also mal im Ernst, das ist doch bekloppt, oder?
		setExpandVertical(true); // klingt logisch, es soll dalang scrollen, aber wozu dann SWT.V_SCROLL?
		setMinSize(content.computeSize(1000, 1000)); // keine Ahnung, was das hier soll
	}
}
```

Wenn ihr mir beim ersten oder zweiten Problem weiterhelfen könnt... Das wär toll! 

So, ansonsten erst mal ein schönes Wochenende!


----------



## Koringar (17. Aug 2009)

Hi,

also bei deiner ersten Frage kann ich dir leider nicht weiterhelfen, aber zu der zweiten.
Es ist doch ganz gut erklärt in den Link denn du da gepostet hast, du erstellst in der View selbst als erstes das Scrollbare Composite und dann deine Composite's (Elemete), die du Angezeigt bekommen haben willst und übergibt sie am Ende der Scrollbare Composite.

Hier mal ein Beispiel:


```
sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);		
		
		groupMonitorEintrag = new Composite(sc, SWT.NONE);
		GridLayout gridLayout = new GridLayout ();
		gridLayout.numColumns = 2;
		groupMonitorEintrag.setLayout (gridLayout);
		
		lbnID = new CLabel (groupMonitorEintrag, SWT.NONE);
		lbnID.setText ("Text:");
		
		txtID = new Text (groupMonitorEintrag, SWT.BORDER);
          txtID.setText("Hallo"); 

          sc.setContent(groupMonitorEintrag);
	    sc.setMinSize(groupMonitorEintrag.computeSize(SWT.DEFAULT, SWT.DEFAULT));
	    sc.setExpandHorizontal(true);
	    sc.setExpandVertical(true);
```


----------



## dzim (18. Aug 2009)

Hui

ich weiß nicht, was du anders gemacht hast als ich, aber ich hab jetzt mal wie du das blöde ScrolledCompoiste überall um kritische eigene Composites herumgewrappt und - oh Wunder - es geht!

Danke für den Tipp mit Quellcode - das hat echt geholfen!


----------

