JScrollBar komplett runterscrollen

Poehli

Mitglied
Hi,
wie der Titel schon sagt, versuche ich gerade ein JScrollBar Objekt so zu modifizieren, dass die VerticalScrollBar komplett unten ist.
Mein Ansatz dazu:
Code:
"scrollbar".getVerticalScrollBar().setValue("textarea".getHeight());
Funktioniert auch teilweise, jedoch lässt er die letzte Zeile der Textarea immer unberücksichtig. Ich habe ebenfalls mit getMaximum versucht die Position zu setzten, dies hatte jedoch genau das gleiche Ergebnis. Sämtliche (re)validates oder paints oder sonst was (ich versteh leider immernoch nicht so recht, das validate tut), hat nicht gebracht. Genausowenig wie ein +100 hinten ranzusetzen, um Manuell die Größe zu ändern.
Hat jemand ne Idee, oder eine Erklärung für mich?
 
Einen ganz ähnlichen Ansatz hatte ich auch schon versucht.
Also hier noch ein größerer Teil, meines "Chats":
Code:
// view ist ein JTextArea
		view.setBackground(Color.LIGHT_GRAY);
		view.setText("");

		view.setEditable(false);
		view.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
		view.setSize(this.getWidth()-10, this.getHeight()-150);

// texts ist ein JScrollPane
		texts = new JScrollPane(view);
		texts.setPreferredSize(new Dimension(this.getWidth()-10,this.getHeight()-150));
		texts.setBackground(Color.RED);
		texts.setViewportView(view);
		texts.setVisible(true);

...

// Funktionierender (mehr oder weniger) Listener, der vom Chatserver die Nachrichten empfängt (Daten kommen richtig an und angezeigt, Also liegt es schonmal nicht am Listener selbst)
                 setChatListener(new ChatListener() {
			
			@Override
			public void newMessage(ChatEvent e) {
				System.out.println("new Message");
				view.setText(view.getText()+"\n"+e.newestMsg);
				view.setBackground(Color.LIGHT_GRAY);
				texts.getVerticalScrollBar().setValue(Integer.MAX_VALUE);
				texts.getVerticalScrollBar().revalidate();
				texts.revalidate();
				texts.repaint();
			}
		});

Sorry für das inflationäre revalidate - ich dachte lieber einmal zu viel, als zu wenig
 
Den Aufbau der UI kann man jetzt nicht erkennen (welche Komponenten gibt es, welche LayoutManager du verwendest, wie die Komponenten zusammen gehören). Kannst du nicht ein minimales, lauffähiges Beispiel erstellen?
 
Code:
public class ClientGUI(){
	JTextArea 	textField = new JTextArea(), view = new JTextArea();
	JButton 	submit	  = new JButton("sende");
	JScrollPane message, texts;
	public ClientGUI() {
		setSize(400,400);
		textField.setSize(this.getWidth()-10, 100);
		textField.setEditable(true);
		textField.setText("TextField");
		
		message = new JScrollPane();
		message.setLayout(new ScrollPaneLayout());
		message.setPreferredSize(new Dimension(this.getWidth()-10,30));
		message.setBackground(Color.BLUE);
		message.setViewportView(textField);
		message.setVisible(true);
		

		view.setBackground(Color.LIGHT_GRAY);
		view.setText("");
		setChatListener(new ChatListener() {
			
			@Override
			public void newMessage(ChatEvent e) {
				System.out.println("new Message");
				view.setText(view.getText()+e.newestMsg);
				texts.getVerticalScrollBar().setValue(Integer.MAX_VALUE);
				texts.getVerticalScrollBar().revalidate();
				texts.revalidate();
				texts.repaint();
			}
		});
		view.setEditable(false);
		view.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
		view.setSize(this.getWidth()-10, this.getHeight()-150);

		texts = new JScrollPane(view);
		texts.setPreferredSize(new Dimension(this.getWidth()-10,this.getHeight()-150));
		texts.setBackground(Color.RED);
		texts.setViewportView(view);
		texts.setVisible(true);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());
		getContentPane().setLayout(new BorderLayout());
		panel.add(message);
		panel.add(texts);
		panel.setBackground(Color.pink);
		getContentPane().add(panel,BorderLayout.CENTER);
		getContentPane().setVisible(true);
		setVisible(true);		
	}
}

Gut, ich habe lediglich einen Windowlistenener rausgenommen, sowie einen Component Listener. Somit sollte der Code funktionieren (natürlich steht bei mir nicht alles im Konstruktor)
 
Das ist doch nichtmal halb lauffähig...nach dem ich die Syntaxfehler behoben hab und eine main dazu geschrieben habe, fehlt mir immer noch "ChatListener". Ich hatte nicht vor alles nochmal selbst nachzuprogrammieren.

Ich will auch keinen ChatListener, einfach nur eine main, in der ein paar Swing Komponenten erstellt werden, anhand derer man dein Problem erkennen kann.
 
Hier mal ein lauffähiges Beispiel:

Java:
package de.tutorials.forum.help.poehli.scrollpane;

import java.awt.Point;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

@SuppressWarnings("javadoc")
public class ScrollPaneSample extends JFrame {
	private static final long	serialVersionUID	= -8300392833098853657L;

	private JTextArea			textArea;
	private JScrollPane			scrollPane;

	public ScrollPaneSample() {
		setTitle(getClass().getSimpleName());
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		add(getScrollPane());

		getTextArea().setText("rofl");

		new Thread() {
			@Override
			public void run() {
				while(true) {
					getTextArea().append("\nfoobar");

					try {
						TimeUnit.SECONDS.sleep(1);
					} catch(InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();

		setSize(250, 150);
		setLocationRelativeTo(null);
	}

	public static void main(String[] args) {
		new ScrollPaneSample().setVisible(true);
	}

	private JScrollPane getScrollPane() {
		if(scrollPane == null) {
			scrollPane = new JScrollPane(getTextArea());
		}

		return scrollPane;
	}

	private JTextArea getTextArea() {
		if(textArea == null) {
			textArea = new JTextArea();
			textArea.setDocument(new PlainDocument() {
				private static final long	serialVersionUID	= 8264657828868381472L;

				@Override
				public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
					super.insertString(offs, str, a);

					Point position = new Point(0, getTextArea().getPreferredScrollableViewportSize().height
							- getScrollPane().getViewport().getSize().height);
					if(position.y < 0) position.y = 0;
					getScrollPane().getViewport().setViewPosition(position);
				}
			});
		}

		return textArea;
	}
}
 
Funktioniert bei mir einwandfrei. Ist dein Problem an dem Beispiel nachvollziehbar?

Welches Betriebssystem? Kannst du einen Screenshot machen?
 
Nein ist es leider nicht... Warum auch immer, aber jetzt (ich wollte einen Screenshot erstellen) wird die letzte Nachricht nicht mehr abgeschnitten... ich habe NICHTS geändert.
Dennoch zeigt die ScrollBar noch an, dass sie nicht am Ende ist:Bildschirmfoto 2012-12-22 um 15.24.09.png
Ich verwende - wie sich erkennen lässt - MacOSX (genauer 10.6.8)
Bei meinem Testprogramm (wollte ich heute noch hochladen), klappte das auch einwandfrei, was die ganze Sache noch unverständlicher machte :/
(als Hinweis: die Farben hab ich nur random gesetzt ;) )
 

Neue Beiträge

Zurück