JScrollPane immer ganz unten ausrichten

Status
Nicht offen für weitere Antworten.
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
 
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 🙂
 
Hi,

das hab ich schon versucht, geht leider nicht:

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

Lg Chriss
 
geht schon, machs aber lieber so:

Code:
SwingUtilities.invokeLater( new Runnable() {
  public void run() { theBar.setValue(theBar.getMaximum()); } } );
 
@ Tobias

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

Das sieht dann bei mir so aus:

Code:
SwingUtilities.invokeLater( new Runnable() {
  public void run() { reiter1Pane.setValue(reiter1Pane.getMinimum()); } } );
 
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
 
Code:
reiter1Pane
ist bei mir ein JScrollPane. Da müsste das doch auch gehen oder?
 
Ne, das müssen die JScrollbar´s sein! Also der horizontale oder vertikale! (getVertical/Horizontalscrollbar)
 
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:

Code:
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:

Code:
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
 
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:

Code:
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
 
Setz mal das StreamDescriptionProperty auf null bevor du setPage() aufrufst. Laut API erzwingst du damit ein Neuladen der Seite.

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

mpG
Tobias
 
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
 
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
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben