1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Scrollbar bei TextPane soll immer ganz unten sein

  • owaye
  • 20. Januar 2008 um 01:41
  • Unerledigt
  • owaye
    6
    owaye
    Mitglied
    Reaktionen
    3
    Punkte
    313
    Beiträge
    46
    • 20. Januar 2008 um 01:41
    • #1

    hi ihr Javagurus!

    Brauche eure Hilfe bei folgendem Problem:
    Ich hab mir schon den Kopf rot geärgert => :mad: weil ich nicht draufkomme, wie es möglich ist, ein JTextPane so zu realisieren, dass Text, der in diesem Pane ausgegeben wird, immer bis ans Ende gescrollt ist, also der Scrollbalken soll immer ganz unten sein, sodass man die letzte Zeile lesen kann.

    Man kann sich das so vorstellen wie ein Console-Output, wo die neuesten Nachrichten unten angefügt werden sollen: nur will ich indemfall, dass bestimmte Nachrichten farbig ausgegeben werden, weswegen ich ein JTextPane nehmen muss und keine TextArea. Die TextArea von AWT erledigt das automatisch, dass nach unten gescrollt wird, hat jedoch nur 1 einzige Farbe für den Text. Deswegen musste ich mich mit TextPane auseinandersetzen.

    Ich hab schon soviel Lösungsansätze versucht, aber der Scrollbalken will partout nicht runterscrollen. Der letzte Versuch war der, wo es geheissen hat: "man soll die Position vom Cursor ganz an den Schluss hin setzen, weil er dann automatisch zum Schluss scrollt".

    Wenn man sich mein Beispiel aber ansieht, sieht man, dass der Cursor zwar an der Endposition ist, aber DENNOCH nicht gescrollt ist. Ich bin mit meinem Latein am Ende und weiss nicht mehr weiter.

    Kann sich vielleicht das jemand anschauen, wieso bei mir das nicht geht, oder einen Lösungsansatz? Würd mich wahnsinnig freuen.


    Java
    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;
    
    
    public class TextSamplerDemo2 extends JPanel
    {
    	StyledDocument doc;
    	JTextPane textPane;
    	JScrollPane scrollPane;
    	JPanel panel;
    	Style def,s;
    
        public TextSamplerDemo2()
        {
            setLayout(new BorderLayout());
    
    
            textPane = new JTextPane();
            textPane.setPreferredSize(new Dimension(250, 120));
    
            doc = textPane.getStyledDocument();
    
            def = StyleContext.getDefaultStyleContext().
            getStyle(StyleContext.DEFAULT_STYLE);    
            s = doc.addStyle("style1", null);
            StyleConstants.setForeground(s,Color.RED);        
    
            scrollPane = new JScrollPane(textPane);
    
            panel = new JPanel(new GridLayout(1,0)); // GridLayout notwendig weil scrollbars beim resizen des fensters sonst verschwinden (!?!)
            panel.add(scrollPane);
    
    	    add(panel,BorderLayout.CENTER);
    
            printsomelines();
    
           	textPane.setCaretPosition(doc.getLength()); // setze Cursor an schluss
        }
    
        public void printsomelines()
        {
        	String harr = "adhawjkdhwajkdhawdhwa\nadhawjkdhwajkdhawdhwa\nadhawjkdhwajkdhawdhwa\nadhawjkdhwajkdhawdhwa";
        	String hark = "adhawjkdhwajkdhawdhwad akwdjhawkjdhkwadhkwadhwkahdkwahdkwhdkawhdkawhd!";
    
        	try 
            {
                doc.insertString(doc.getLength(),harr,doc.addStyle("style1",s));
                doc.insertString(doc.getLength(),harr,doc.addStyle("style1",s));
                doc.insertString(doc.getLength(),hark,doc.addStyle("style1",def));
                doc.insertString(doc.getLength(),hark,doc.addStyle("style1",def));
            }
            catch(BadLocationException bled){}
        }
    
        public static void main(String[] args)
        {      
        	JFrame frame = new JFrame("TextSamplerDemo2");
        	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(new TextSamplerDemo2());
            frame.pack();
            frame.setVisible(true);
    	}
    }
    Alles anzeigen
  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 20. Januar 2008 um 11:42
    • #2

    Das funktioniert nicht im Konstruktor, weil zu dem Zeitpunkt, an dem der Konstruktor aufgerufen wird, der Panel noch gar nicht existiert bzw gezeichnet wurde.

    Das hier geht z.b.:

    Java
    package test;
    
    
    import javax.swing.*;
    import javax.swing.text.*;
    import java.awt.*;
    
    
    public class TestOne extends JPanel {
    	StyledDocument doc;
    	JTextPane textPane;
    	JScrollPane scrollPane;
    	JPanel panel;
    	Style def, s;
    
    
    	public TestOne() {
    		setLayout(new BorderLayout());
    
    
    		textPane = new JTextPane();
    		textPane.setPreferredSize(new Dimension(250, 120));
    
    
    		doc = textPane.getStyledDocument();
    
    
    		def = StyleContext.getDefaultStyleContext().getStyle(
    				StyleContext.DEFAULT_STYLE);
    		s = doc.addStyle("style1", null);
    		StyleConstants.setForeground(s, Color.RED);
    
    
                    //dieser Konstruktor behebt das "scrollbar verschwindet" Problem
    		scrollPane = new JScrollPane(textPane,
    				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
    				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    
    
    		panel = new JPanel(new GridLayout(1, 0)); // GridLayout notwendig weil
    
    		panel.add(scrollPane);
    		add(panel, BorderLayout.CENTER);
    	}
    
    
    	public void printsomelines() {
    		String harr = "adhawjkdhwajkdhawdhwa\nadhawjkdhwajkdhawdhwa\nadhawjkdhwajkdhawdhwa\nadhawjkdhwajkdhawdhwa";
    		String hark = "adhawjkdhwajkdhawdhwad akwdjhawkjdhkwadhkwadhwkahdkwahdkwhdkawhdkawhd!";
    
    
    		try {
    			doc.insertString(doc.getLength(), harr, doc.addStyle("style1", s));
    			doc.insertString(doc.getLength(), harr, doc.addStyle("style1", s));
    			doc
    					.insertString(doc.getLength(), hark, doc.addStyle("style1",
    							def));
    			doc
    					.insertString(doc.getLength(), hark, doc.addStyle("style1",
    							def));
    		} catch (BadLocationException bled) {
    		}
    
    
    		textPane.setCaretPosition(doc.getLength()); // setze Cursor an schluss
    
    
    	}
    
    
    	public static void main(String[] args) {
    		JFrame frame = new JFrame("TextSamplerDemo2");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		TestOne testone = new TestOne();
    		frame.add(testone);
    		frame.pack();
    		frame.setVisible(true);
    		testone.printsomelines();
    	}
    }
    Alles anzeigen

    lg, Benjamin Ferrari, bookworm.at

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 20. Januar 2008 um 11:56
    • #3

    Btw: Das "scrollbar verschwindet beim resize" Problem kannst du durch properties im JScrollPane Konstruktor loesen. Hab meinen Code diesbezueglich aktualisiert.

    lg, Benjamin Ferrari, bookworm.at

  • owaye
    6
    owaye
    Mitglied
    Reaktionen
    3
    Punkte
    313
    Beiträge
    46
    • 21. Januar 2008 um 21:17
    • #4

    aha so geht das! vielen dank für die hilfe!!!! endlich kann ich weiterarbeiten :thumb:

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung