# Scrollbar



## chik (4. Feb 2004)

Hallo,
ich habe ein JFrame was sehr groß ist.
Wie bekomme ich es hin, das wenn dieses JFRame kleiner gezogen wird, als eine Mindestgröße, an rechten und unteren Rand scrollbalken erscheinen?

Bei C++ kamen die immer automatisch, kann doch nicht sein, das man sowas in Java kompliziert selber programmieren muss :-(

Gibt es da schon irgendwie was fertige soder so?

Danke für jede antwort

Krause


----------



## Tobias (4. Feb 2004)

JScrollPane ist das Zauberwort. Da packst du dein Frame rein und schon geht der Rest automatisch...

mpG
Tobias


----------



## chik (4. Feb 2004)

Mhh, funktioniert irgendwie nicht ganz.

Also ich habe alle Panel und Toolbars die sonst dem *getContentPane() * zugeordnet werden in ein *JPanel* gepackt, danach ein *JScrollPane testpane = new JScrollPane() * erzeugt dieses dann dem *getContentPane()* zugeordnet und dem testpane dann das andere jPanel mit allen Komponenten.

Leider wird dann nur noch ein leeres Frame angezeigt :-(

Muss ich noch irgendwelche Attribute setzen im JScrollPane?

Hast du vielleicht nen Beispiel?

Danke

Krause


----------



## Roar (4. Feb 2004)

ääh. es wär sinnvoll die kompoonenten auch in die JScrollPane einzufügen, sonst bringts ja nix !?
und toolbars in ne JScrollPane zu packen ist auch sinnlos, weil die toolbar, ja eh kleiner gemacht wird, und wenn der frame zu klein ist für di etoolbar dann verschwinden glaubich die buttons  ???:L


----------



## Tobias (4. Feb 2004)

```
JPanel scrollable = new JPanel();
JScrollPanel scrolli = new JScrollPanel(scrollable);
scrollable.add(new Button("Hallo");
```

mpG
Tobias


----------



## chik (4. Feb 2004)

Jo, super, alles okay jetzt habe ich das auch hinbekommen, hatte vergessen dem JScroppPane das JPanel zu übergeben 

Danke an alle

Krause


----------



## joschika77 (19. Mrz 2004)

Kann man den Scrollbalken immer unten lassen?
Also wenn ich immer was neues einfüge muß ich mit dem Scrollbalken nachrücken.
Wie kann ich das realisieren?

MfG Ronn


----------



## bygones (19. Mrz 2004)

Das kannst du über das BoundedRangeModel machen, das als Model der ScrollBar gesetzt ist. Über setValue kannst du dann den "Wert" der Scrollbar festlegen und über model.getMaximum() das Maximum bestimmen:

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JScrollPane.html
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/DefaultBoundedRangeModel.html
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JScrollBar.html

```
JScrollPane pane = new JScrollPane();
.....
JScrollbar scrollBar = pane.getVerticalScrollBar();
scrollBar.setValue(scrollBar.getModel.getMaximum);
```


----------



## joschika77 (22. Mrz 2004)

Hallo!

Irgendwie funktioniert das nicht.
Was ist falsch?


```
taAusgabe = new JTextArea();
	taAusgabe.setForeground(Color.WHITE);
	taAusgabe.setBackground(Color.BLACK);
	taAusgabe.setEditable(false);
	jscrollAusgabe = new JScrollPane(taAusgabe);
	jscrollAusgabe.setBounds(10,120,280,150);
				
	jsb = jscrollAusgabe.getVerticalScrollBar();
	jsb.setValue(jsb.getMaximum());
	add(jscrollAusgabe);
```


----------



## joschika77 (22. Mrz 2004)

Hat wirklich keine eine Ahnung?

MfG Ronn


----------



## joschika77 (24. Mrz 2004)

Hallo!

Ich muß leider nochmal fragen wie das mit dem BoundedRangeModel funktioniert?
Habe probiert und probiert.Leider ohne Erfolg.
Hat jemand vielleicht ein Beispiel an dem ich das nachvollziehen kann?
Wäre echt cool.

MfG Ronn


----------



## bygones (24. Mrz 2004)

Ein Beispiel:


```
public class Test extends JFrame {
	private JScrollPane p;
	public Test() {
		super("t");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		JTextArea area = new JTextArea(50, 20);
		p = new JScrollPane(area);
		p.setPreferredSize(new Dimension(200, 200));
		getContentPane().add(p);
		pack();
		setVisible(true);
	}

	public void reset() {
		JScrollBar horizontalScroll = p.getVerticalScrollBar();
		BoundedRangeModel horizontalScrollModel = horizontalScroll.getModel();
		int maximum = horizontalScrollModel.getMaximum();
		int extent = horizontalScrollModel.getExtent();

	    horizontalScrollModel.setValue(maximum);
		repaint();
	}
	public static void main(String[] args) {
		Test a = new Test();
		a.reset();
	}
```
bei mir klappts nach dem Aufruf von "reset()"


----------



## joschika77 (24. Mrz 2004)

Aber was mache ich mit der Textarea?
Kann ich die einfach mit einfügen???

MfG ronn


----------



## bygones (24. Mrz 2004)

Ronnules hat gesagt.:
			
		

> Aber was mache ich mit der Textarea?
> Kann ich die einfach mit einfügen???
> MfG ronn


Wie meinst du, einfach einfügen ??? ich habe einen frame erstellt, der als einzige Komponente eine JScrollPane hat, die wiederum hat eine JTextArea als VIewport.....


----------



## joschika77 (24. Mrz 2004)

Also ich habe das so gemacht:
Ich habe ein Frame mit extends JPanel.Im JPanel sind die ganzen Komponenten.
Somit auch die reset() funktion.


```
taAusgabe = new JTextArea();
taAusgabe.setForeground(Color.WHITE);
taAusgabe.setBackground(Color.BLACK);
taAusgabe.setEditable(false);
jscrollAusgabe = new JScrollPane(taAusgabe);
jscrollAusgabe.setBounds(10,90,320,180);
jscrollAusgabe.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jscrollAusgabe.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
reset(); //hier ruf ich die Funktion auf
add(jscrollAusgabe);


public void reset() 
{ 
    JScrollBar horizontalScroll = jscrollAusgabe.getVerticalScrollBar(); 
    BoundedRangeModel horizontalScrollModel = horizontalScroll.getModel(); 
    int maximum = horizontalScrollModel.getMaximum(); 
    int extent = horizontalScrollModel.getExtent(); 

    horizontalScrollModel.setValue(maximum); 
repaint(); 
}
```

Was mache ich falsch???

MfG Ronn


----------



## bygones (24. Mrz 2004)

So wie es aussieht ist "setBounds" das Problem. Dadurch bekommt die JScrollPane nicht ihr preferredSize mit und kann nicht richtig anzeigt werden !
Sobald du setBounds durch setPreferredSize(Dimension d) ersetzt (oder das dazu fügst) funktionierts !

und im Frame nicht pack() bzw. setSize vergessen !


----------



## joschika77 (24. Mrz 2004)

Hab das jetzt verändert.
Aber er will einfach nicht.Die TextArea ist nicht mehr sichtbar.
Mein Layout ist null.
Ich muß doch setBounds nehmen.Oder???


```
taAusgabe = new JTextArea();
taAusgabe.setForeground(Color.WHITE);
taAusgabe.setBackground(Color.BLACK);
taAusgabe.setEditable(false);
jscrollAusgabe = new JScrollPane(taAusgabe);
//jscrollAusgabe.setBounds(10,90,320,180);
jscrollAusgabe.setPreferredSize(new Dimension(320, 180));
jscrollAusgabe.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
jscrollAusgabe.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
reset();
add(jscrollAusgabe);
```

MfG Ronn


----------



## bygones (24. Mrz 2004)

```
public class Test extends JFrame {
	private JScrollPane jscrollAusgabe;
	private JTextArea taAusgabe;

	public Test() {
		JPanel p = new JPanel();
		taAusgabe = new JTextArea();
                // größe der JTextarea festlegeg
		taAusgabe.setPreferredSize(new Dimension(500,500));
		taAusgabe.setForeground(Color.WHITE);
		taAusgabe.setBackground(Color.BLACK);
		taAusgabe.setEditable(false);
		jscrollAusgabe = new JScrollPane(taAusgabe);
                // größe
		jscrollAusgabe.setPreferredSize(new Dimension(320,180));
		jscrollAusgabe.setVerticalScrollBarPolicy(
			JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		jscrollAusgabe.setHorizontalScrollBarPolicy(
			JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		p.add(jscrollAusgabe);
		getContentPane().add(p);
		pack();
	}
	
	public void reset() {
		JScrollBar horizontalScroll = jscrollAusgabe.getVerticalScrollBar();
		BoundedRangeModel horizontalScrollModel = horizontalScroll.getModel();
		int maximum = horizontalScrollModel.getMaximum();

		horizontalScrollModel.setValue(maximum);
		repaint();
	}
	
	public static void main(String[] args) {
		Test a = new Test();
		a.setVisible(true);
		a.reset();
	}
```
So funktioniert es.

Ruf reset erst auf, nachdem du schon die JScrollPane hinzugefügt hast !
setBounds musst du nicht nehmen, das DefaultLayout ist FlowLayout, also kannst du einfach über add die Component hinzufügen !

Wichtig ist bei JScrollPane ist, dass sie weiß wie groß sie sein soll bzw. wie groß der Viewport sein soll (am Besten immer mit setPreferredSize)


----------



## joschika77 (24. Mrz 2004)

Dieses pack(); kennt er in der extends JPanel Klasse nicht.
Wo soll ich jetzt die reset() Methode aufrufen?
In der Frame Klasse?
Da kennt er aber die Methode nicht.


MfG Ronn


----------



## bygones (24. Mrz 2004)

Der Frame:

```
public class Test extends JFrame {
	private TestPanel testPanel;
	
	public Test() {
		getContentPane().add(testPanel = new TestPanel());
		pack();
	}
	
	public void resetTestPanel() {
		testPanel.reset();
	}
	
	public static void main(String[] args) {
		Test a = new Test();
		a.setVisible(true);
		a.resetTestPanel();
	}
}
```
Die Panelklasse:
	
	
	
	





```
public class TestPanel extends JPanel {
	private JScrollPane jscrollAusgabe;
	private JTextArea taAusgabe;

	public TestPanel() {
		taAusgabe = new JTextArea();
		taAusgabe.setPreferredSize(new Dimension(500,500));
		taAusgabe.setForeground(Color.WHITE);
		taAusgabe.setBackground(Color.BLACK);
		taAusgabe.setEditable(false);
		jscrollAusgabe = new JScrollPane(taAusgabe);
		jscrollAusgabe.setPreferredSize(new Dimension(320, 180));
		jscrollAusgabe.setVerticalScrollBarPolicy(
			JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		jscrollAusgabe.setHorizontalScrollBarPolicy(
			JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		add(jscrollAusgabe);
	}

	public void reset() {
		JScrollBar horizontalScroll = jscrollAusgabe.getVerticalScrollBar();
		BoundedRangeModel horizontalScrollModel = horizontalScroll.getModel();
		int maximum = horizontalScrollModel.getMaximum();
		int extent = horizontalScrollModel.getExtent();

		horizontalScrollModel.setValue(maximum);
		repaint();
	}
}
```

Klar ? Dein Frame kennt den Panel den er anzeigt... also ruf das reset darüber auf...


PS: Das ist nur eine Mögichkeit das zu lösen..


----------



## joschika77 (25. Mrz 2004)

Hi!Ich bins schon wieder.
Habe es leider noch nicht hinbekommen.

Also in der Frame Klasse rufe ich im Kostruktor die Panelinstanz so auf:

```
//Instanz Panel
		csp = new ChatServerPanel(portadresse);
		//csp.setBounds(0,0,350,320);
		//csp.setPreferredSize(new Dimension(350,320));
		csp.setVisible(false);
		csp.addMouseListener(this);
		csp.setSize(350,320);
		csp.reset();
```
Und in der Panel Klasse habe ich es jetzt so:

```
taAusgabe = new JTextArea();
		taAusgabe.setPreferredSize(new Dimension(320,180)); 
		  taAusgabe.setForeground(Color.WHITE); 
		  taAusgabe.setBackground(Color.BLACK); 
		  taAusgabe.setEditable(false);
	
		jscrollAusgabe = new JScrollPane(taAusgabe);
		//jscrollAusgabe.setBounds(10,90,320,180);
		jscrollAusgabe.setPreferredSize(new Dimension(320,180));
                                jscrollAusgabe.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		jscrollAusgabe.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		add(jscrollAusgabe);
```

So ist die TextArea leider nicht sichtbar.Was kann ich noch machen?

Gruß Ronn


----------



## bygones (25. Mrz 2004)

Ok, mein letzer Versuch  :wink: 

1. du fügst den Panel gar nicht in deinen Frame hinzu....
2. warum setzt du den Panel auf setVisible(false) ???

Code für Frame:

```
csp = new ChatServerPanell("");
//csp.setPreferredSize(new Dimension(350,320)); // <- nicht nötig, die Komponten des Panels regeln die Größe
csp.addMouseListener(this); // <-- warum ist der Frame der Listener für den Panel und nicht der Panel selbst?
getContentPane().add(csp); // <-- panel wird dem Frame hinzugefügt<
pack(); // <- die Größe des Frames wird gesetzt
csp.reset(); // <- scrollbar wird nach unten geschoben
```


----------



## joschika77 (25. Mrz 2004)

So der Balken ist jetzt unten.
Leider scrollt er nicht nach wenn das Sichtbare in der Area voll ist.
Ich weiß, ich nerve bestimmt schon.
Aber weist du vielleicht auch noch woran das liegt?

MfG Ronn


----------



## bygones (25. Mrz 2004)

wie er scrollt nicht ?!
ich würde jedensmal, wenn du Text einfügst einfach die reset() Methode aufrufen.... oder was ?


----------



## joschika77 (25. Mrz 2004)

Na ich habe ein Server und ein Client Prog.
Der Client schickt text.Die Area füllt sich.
Aber wenn das sichtbare voll ist geht er nicht weiter.
reset rufe ich auf immer wenn Text kommt.
Liegt das daran das Die TextArea im Panel eine bestimmte Größe bekonmmt?


```
taAusgabe.setPreferredSize(new Dimension(320,180))

jscrollAusgabe.setPreferredSize(new Dimension(320,180));
```

MfG Ronn


----------



## joschika77 (25. Mrz 2004)

So jetzt hab ichs.
Die beiden Zeilen die ich gepostet habe weg und 

```
jscrollAusgabe.setBounds(10,90,320,180);
```

dazu.Dann klappts.
Auf jeden Fall danke ich Dir für deine Geduld.
Das Forum ist mit Abstand das Beste was ich kenne.

MfG Ronn


----------



## bygones (25. Mrz 2004)

Immer wieder gerne


----------

