# JScrollPane immer ganz unten ausrichten



## chriss_2oo4 (21. Apr 2008)

Hi,

wie kann ich das JScrollPane immer ganz unten ausrichten?


Lg Chriss


----------



## L-ectron-X (21. Apr 2008)

Den Inhalt oder die Komponente?


----------



## chriss_2oo4 (21. Apr 2008)

Hi,

der Inhalt der Komponente ist eine JTextPane. Allerdings füge ich nichts mit append(...) hinzu, jedes Mal wenn ich den Inhalt aktualisiere, erzeuge ich eine neue Instanz der JTextPane und dort soll die da scrollpane ganz unten ausgerichtet sein.

Lg Chriss


----------



## Guest (21. Apr 2008)

Du könntest zB die JScrollBar von der ScrollPane holen und dann scrlbar.setValue(scrlbar.getMaximum()) machen. Dann müsste er nach ganz unten gehen


----------



## chriss_2oo4 (22. Apr 2008)

Hi,

das hab ich schon versucht, geht leider nicht:


```
javax.swing.JScrollBar theBar = this.jScrollPane1.getVerticalScrollBar();
		theBar.setValue(theBar.getMaximum());
```

Lg Chriss


----------



## Gast (22. Apr 2008)

geht schon, machs aber lieber so:


```
SwingUtilities.invokeLater( new Runnable() {
  public void run() { theBar.setValue(theBar.getMaximum()); } } );
```


----------



## Guest (22. Apr 2008)

Und wie kann ich eine JScrollPane immer ganz oben ausrichten?


----------



## Tobias (22. Apr 2008)

Indem du statt getMaximum() get Minimum() aufrufst??


----------



## Guest (22. Apr 2008)

Danke.


----------



## Guest (22. Apr 2008)

@ Tobias

wenn ich getMinimum() aufrufe, kennt der Compiler die Methode nicht.

Das sieht dann bei mir so aus:


```
SwingUtilities.invokeLater( new Runnable() {
  public void run() { reiter1Pane.setValue(reiter1Pane.getMinimum()); } } );
```


----------



## Tobias (22. Apr 2008)

Du solltest getMinimum() auch auf der ScrollBar aufrufen und nicht auf irgendeinem Objekt. Vollzieh mal den Thread bis hierher nach und setz die für das Maximum-Problem gegebene Lösung auf dein Minimum-Problem um. Es ist nur die eine Methode, die du austauschen mußt, also wirklich nicht weiter schwierig.

mpG
Tobias


----------



## Guest (22. Apr 2008)

```
reiter1Pane
```
 ist bei mir ein JScrollPane. Da müsste das doch auch gehen oder?


----------



## thE_29 (22. Apr 2008)

Ne, das müssen die JScrollbar´s sein! Also der horizontale oder vertikale! (getVertical/Horizontalscrollbar)


----------



## chriss_2oo4 (22. Apr 2008)

Hi,

ich hab mir jetzt mal den Wert der von der Methode getMaximum() anzeigen lassen, der ist immer 204, daran wird auch das Problem liegen.

Vorgehensweise meines Programms: immer wenn ich den Inhalt der HTML-Datei ändere, die ich im JTextPane anzeige, führe ich folgende Methode aus:


```
public void ReloadTxtChat()
	{
		txtChat = new JTextPane();
		jScrollPane1.setViewportView(txtChat);
		txtChat.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
		txtChat.setContentType("text/html");
		txtChat.setEditable(false);
		try
		{
			java.io.File filePath = new java.io.File(Main.DIR_DATA, strFilename);
			java.net.URL urlPath = filePath.toURL();
			txtChat.setPage(urlPath.toString());
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		SwingUtilities.invokeLater( new Runnable() 
		{
			public void run() 
			{
				javax.swing.JScrollBar theBar = jScrollPane1.getVerticalScrollBar();
				theBar.setValue(theBar.getMaximum());
				System.out.println("Maximum"+theBar.getMaximum());
			}
		});
	}
```

Dabei ist ja schon komisch, dass ich die Komponente txtChat jedes Mal neu erzeugen muss, dass der geänderte Inhalt der HTML-Datei angezeigt wird. Normalerweise müsste doch setPage(...) schon ausreichen, also der Teil oberhalb des Try-Blocks weglassen werden können.

In der Methode initGui() werden die Komponenten (JScrollPane und JTextPane) wie gefolgt erzeugt:


```
private JScrollPane getJScrollPane1() 
	{
		if(jScrollPane1 == null) 
		{
			jScrollPane1 = new JScrollPane();
			{
				txtChat = new JTextPane();
				jScrollPane1.setViewportView(txtChat);
				txtChat.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
				txtChat.setContentType("text/html");
				txtChat.setEditable(false);
			}
		}
		return jScrollPane1;
	}
```

Bin froh über jede Hilfe bzgl. meines Problems.

Lg Chriss


----------



## chriss_2oo4 (22. Apr 2008)

Sobald ich die Größe des Fensters ändere, ändert sich auch der Wert, der von getMaximum() zurückgegeben wird.

Das Frame ist mit einem GridBag-Layout-Manager gestaltet. Das JScrollpane wird wie gefolgt zum Frame hinzugefügt:


```
getContentPane().add(getJScrollPane1(), new GridBagConstraints(1, 3, 6, 4, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
```


Lg Chriss


----------



## Tobias (22. Apr 2008)

Setz mal das StreamDescriptionProperty auf null bevor du setPage() aufrufst. Laut API erzwingst du damit ein Neuladen der Seite.


```
Document doc = jEditorPane.getDocument();
   doc.putProperty(Document.StreamDescriptionProperty, null);
```

mpG
Tobias


----------



## chriss_2oo4 (22. Apr 2008)

Hi,

danke für den Tipp, somit muss ich nicht immer die Komponente neu erzeugen.

Allerdings ändert sich die Größe des JTextPanes immer noch nicht. Ist irgendwie komisch, die Scrollbar erscheint sobald ich mehr Text eingebe als angezeigt werden kann, aber jTextPane.getSize().heigth liefert immer den gleichen Wert?

Lg


----------



## Tobias (22. Apr 2008)

getSize().height ist die Höhe, die die graphische Repräsentation der TextPane auf dem Bildschirm einnimmt. Die ändert sich nicht, nur weil du was hinzufügst (zumindest nicht, wenn eine ScrollPane vorhanden ist).

mpG
Tobias


----------

