# JScrollPane Problem



## bladepit (8. Sep 2011)

Hallo an alle,

ich habe ein Problem mit einer ScrollPane von mir. Diese beinhaltet ein selber geschriebenes Objekt (eine Grafik) welche eine JComponent ist.

Ich habe schon alles probiert selbst aber die ScrollPane will nicht mit dem Objekt scrollen geschweige denn die Größe des Objektes annehmen sprich: Inital-Zustand ist das ich den Slider in der ScrollPane gar nicht sehe obwohl der da sein müsste. Hier mein Code:


```
jsp = new JScrollPane(dendro, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
jsp.getViewport().add(dendro, null);
```

dendro ist hier mein eigenes Objekt was vom Typ JComponent ist. Was mache ich falsch?

Gruß

bladepit


----------



## Volvagia (8. Sep 2011)

Warum addest du das selbe Objekt nochmal am Viewport? Kommentier die Zeile mal aus.


----------



## bladepit (8. Sep 2011)

Oh...aber trotzdem ohne Wirkung...die ScrollPane bleibt trotzdem "leer"


----------



## Volvagia (8. Sep 2011)

Dann zeig mal etwas mehr Source.
Denk daran, dass nur Scrollbar ist wenn du die Pref. Size richtig zurückgibst. Aber die vertical Bar solltest du trotzdem sehen.


----------



## Michael... (8. Sep 2011)

Erstens das:


Volvagia hat gesagt.:


> Warum addest du das selbe Objekt nochmal am Viewport? Kommentier die Zeile mal aus.


Und zweites:
Die JScrollPane verwendet die PreferredSize der Komponente im Viewport, um die Notwendigkeit und den Skrollbereich der Skrollbalken zu bestimmen.
Ich würde meinen A... darauf verwetten, dass die PreferredSize Deiner selbst geschriebenen Komponente 0x0 liefert ;-)


----------



## bladepit (8. Sep 2011)

@Michael da hast du sowas von Recht mi 0x0.....

Das Problem an der Stelle ist das die Komponenten nicht selber von mir geschrieben ist sondern von einem Kollegen der aber net mehr ist. 

Was muss ich bei der Klasse vom Typ JComponent ändern das diese eine PreferedSize hat?

Oder kann ich den Weg anderesrum gehen indem ich die PreferedSize nach dem das Objekt erstellt ist so setze so groß wie das Panel ist welche die ScrollPane beinhaltet?


----------



## Volvagia (8. Sep 2011)

Ja, du kannst sie auch später mit setPreferredSize setzen. Warum verwendet ihr eigendlich nicht für eine Grafik ein Label?


----------



## bladepit (8. Sep 2011)

Also wenn ich nun das machen (Ausgabe der Dim ist 221;180) passiert trotzdem nix:


```
dendro.setPreferredSize(paneldimension);
jsp = new JScrollPane(dendro, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
```

Wie meinst du das mit dem Label?


----------



## Volvagia (8. Sep 2011)

EIn Bild kann man genauso gut per Label anzeigen.
Zeig mal etwas mehr Source.


----------



## bladepit (8. Sep 2011)

Ok das wird nun was viel werden aber naja. 

Die Klasse Dendrogram (das wichtiges denk ich): 


```
public class Dendrogram extends MatrixRelatedComponent 

private void updateContainerSize() {
		JScrollPane container = (JScrollPane)this.getParent().getParent();
		Dimension d = new Dimension(this.getMinimumSize().width, this.getMinimumSize().height);
		if(this.getAxis() == Axis.X)
			d.height += container.getHorizontalScrollBar().getHeight() + 5 + DENDROGRAM_YOFFSET;
		else if(this.getAxis() == Axis.Y)
			d.width += container.getVerticalScrollBar().getWidth() + 5 + DENDROGRAM_XOFFSET;
		
		container.setMinimumSize(d);
		container.setPreferredSize(d);
		
		container.updateUI();
	}
```

Und dann noch MatrixComponent:


```
public abstract class MatrixRelatedComponent extends JComponent {
	
	public enum Axis { X, Y };
	
	private Axis axis;
	private Dimension tileSize;
	private boolean dataProvided;
	private int numberOfTiles;
	
	protected void setSizeParams(Dimension d) {
		this.setSize(d);
		this.setPreferredSize(d);
		this.setMinimumSize(d);
		this.setMaximumSize(new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE));
	}
```


----------



## Michael... (8. Sep 2011)

Die Klasse 
	
	
	
	





```
MatrixRelatedComponent
```
 besitzt doch eine Methode 
	
	
	
	





```
setSizeParams(Dimension d)
```
 um die Größen zu setzen.

Was soll die Methode 
	
	
	
	





```
updateContainerSize()
```
 in Dendrogramm und was soll die JScrollPane darin? Das ist wohl eher K...


----------



## bladepit (8. Sep 2011)

Wie gesagt ich nutze das nur...

Was der sich dabei gedacht hat kann ich nur erahnen...

Ich versuch mal die updateContainer rauszunehmen und die größe dann zu setzen


----------



## bladepit (8. Sep 2011)

Ok nachdem ich das alles mal rausgenommen und was umstrukturiert hab passiert zwar trotzdem noch nix aber die Größe wird gesetzt. Das mache ich aktuell:


```
dendro.setData((BiCluster) cluster, MatrixRelatedComponent.Axis.Y, tileSize, 6,lblwidth,5);
			dendro.setMaximumSize(new Dimension(Integer.MAX_VALUE, maximumSize.height));
			System.out.println(dendro.getPreferredSize());
			jsp = new JScrollPane(dendro, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
```

Danach hab ich ne Dim von 190;60


----------



## Michael... (8. Sep 2011)

bladepit hat gesagt.:


> Ich versuch mal die updateContainer rauszunehmen und die größe dann zu setzen


Da wird sich vermutlich nicht viel ändern. Nur macht es nicht wirklich Sinn, dass eine Komponente versucht die Größe der umgebenden ScrollPane zu ändern. Je nach verwendetem LayoutManager hat das ja nicht einmal Auswirkung. Nur weil ich beim Auto in der Garage die Türen bis zum Anschlag aufreiße wird die Garage ja nicht größer.

Die Komponente muss "nur" ihre Wunschgröße (PreferredSize) setzen und die JScrollPane passt darauf hin automatisch den skrollbaren Bereich an.


----------



## bladepit (8. Sep 2011)

Wie gesagt (siehe mein letzter Thread) nun wird das dendro erstellt die Daten gesetzt sowie die Size und dann wird die JComponent der ScrollPane hinzugefügt.

Das dendro hat auch ne PreferedSize jedoch passiert immer noch nix.


----------



## Michael... (8. Sep 2011)

bladepit hat gesagt.:


> Das dendro hat auch ne PreferedSize jedoch passiert immer noch nix.


190x60 wird als PreferredSize der Komponente ausgegeben? Ist ja nicht gerade groß, wie groß ist denn die JScrollPane bzw. deren Viewport? Zu Testzwecken könnte man ja mal Werte in Form von 3000x3000 verwenden...


----------



## bladepit (8. Sep 2011)

Hier ist mal ein Bild weil ich krieg das gar net hin...

Directupload.net - Dhjfnvg5m.png

So die ScrollPane um die es geht ist links die ScrollPane. Die soll mit der rechts gekoppelt werden.
Sprich ich scroll rechts in der Heatmap dann soll links mitgescrollt werden.

Ich mache folgendes:

1. Erstelle die Grafik links
2. Erstelle die Heatmap + ScrollPane etc.
3. Erstelle die ScrollPane für die Grafik.

Wie muss ich jetzt die Size für die ScrollPane setzen? Habe schon alles ausprobiert...:-(


----------



## Michael... (8. Sep 2011)

bladepit hat gesagt.:


> So die ScrollPane um die es geht ist links die ScrollPane.


Das wäre dann wohl Schritt 2.


bladepit hat gesagt.:


> Wie muss ich jetzt die Size für die ScrollPane setzen?


Die Size der ScrollPane passt doch (auf dem Bild sind beide ScrollPanes gleich hoch).
Wichtig ist die PreferredSize der Dendrogramm Komponente und die kann man ja z.B. direkt über setPreferredSize(Dimension) oder mit setSizeParams(Dimension) setzen.

Mehr kann ich bei den mir bekannten Informationen nicht dazu sagen.


----------



## bladepit (8. Sep 2011)

So ich kann das nun setzen. Jedoch bekomme ich dann folgendes Problem:

Directupload.net - Dssu2plej.png

Die PrefredSize der JComponent ist wichtig damit die Knoten des Baumes mit den Strings in der Heatmap passen...:-(


----------



## bERt0r (8. Sep 2011)

Ich kann die Bilder leider nicht aufrufen abuer benutzt ihr das Null layout oder wie??


----------



## Michael... (8. Sep 2011)

von der Höhe scheint es doch zu passen. nur die Breite bzw der Rand hat sich verändert.Warum?
Wenn diese Knoten sowieso zu den Strings gehören, warum malst Du das Dendrogramm nicht mit den Strings direkt in die RowHeader Komponente der JScrollPane. Dann hättest Du anschließend nicht das Problem die beiden JScrollPanes zu synchronisieren.


----------



## bladepit (8. Sep 2011)

Ne leider ist es vom Kunden erwünscht den Baum auch weg zu klappen.....das passt schon so gut mit der Unterteilung und ich denke es ist ja möglich die beiden scrollpanes zu synchronisieren....

Warum sich der Rand verändert hat weiß ich noch nicht. Das Problem ist aber wie man sieht das mit den Linien zu den Strings. Wenn ich die Größe der Komponente ändere dann geht die Zuordnung die vorher gemacht wird durch jede Menge Berechnungen und Zeichnungen verloren. 

Ich verstehe nicht warum das bei der Tabelle geht (schließlich ist das da ja nix anderes) und warum das bei meiner eigenen Komponente nicht geht


----------



## Michael... (8. Sep 2011)

bladepit hat gesagt.:


> Ne leider ist es vom Kunden erwünscht den Baum auch weg zu klappen.....


Das ginge ja so auch und man hätte den "störenden" Skrollbalken nicht dazwischen.
Man kann ja auch in der RowHeader - Komponente den Baum zeichnen oder nichtzeichnen und entsprechend die Größe der Komponente anpassen - auch hier kommt es auf die PreferredSize (Breite) an ;-)


----------



## bladepit (8. Sep 2011)

Hmm was mach ich denn nun?

Voll die zwickmühle....setz ich die preferedsize hab ich die scrollpane aber den baum falsch und setz ich die nicht dann hab ich den baum richtig aber keine scrollpane...

Man ist das verflixt...dachte das ich das mal schnell löse würde...:-(


----------



## bERt0r (9. Sep 2011)

Wie oft steht in deinem Code 
	
	
	
	





```
xBeliebigerComponent.add(yBeliebigerComponent,null);
```
?


----------



## bladepit (10. Sep 2011)

Ich bin voll durch einander...

Also hier ist der Code der das Panel auf der linken Seite mit dem Baum erzeugt:


```
this.substdendropanel = new JPanel(new BorderLayout());
		this.substdendropane = new FoldoutPane(substdendropanel,JXCollapsiblePane.Direction.RIGHT, true, Color.white,"Substance Dendogram", false, this,true);
		this.substdendroouterpanel = new JPanel(new BorderLayout());
		this.substdendroouterpanel.add(substdendropane,BorderLayout.WEST);
```

Das substdendropanel beinhaltet dann später die JScrollPane.
Das substdendropane ist die FoldoutPane und das outerpanel ist das Panel welches dann zu dem Layout in der gesamten Darstellung gehört.


----------

