# JScrollPane funktioniert nicht



## davidh38 (11. Okt 2011)

JFrame jframe = new JFrame("Image");
jframe.setContentPane(new JScrollPane(this));

this ist ein JPanel in dem ein Bild gezeichnet wird. wenn das bild größer ist, als die Size, die ich durch Size gesetzt habe, sind leider keine Scrollbalken zu sehen. Woran liegt das?


----------



## bERt0r (11. Okt 2011)

Ummmmm normalerweise macht man das so:

```
JFrame jframe = new JFrame("Image");
JScrollPane scrollPane=new JScrolPane(this);
jframe.add(scrollPane);
```
Weiters geht die ScrollPane nach der PreferredSize und die Vertical/Horizontal ScrollBarPolicy muss natürlich auch stimmen.


----------



## SlaterB (11. Okt 2011)

in erster Linie an zu wenig geposteten Code,

wenn du paintComponent im JPanel überschreibst, dann kann Swing daraus nicht automatisch ableiten was du dir als Größe wünschst,
setze setPreferredSize() !

und ein JScrollPane als ContentPane des JFrames könnte problematisch sein, wahrscheinlich aber auch nicht

edit:
> wenn das bild größer ist, als die Size, die ich durch Size gesetzt habe
für das JScrollPane ist wirklich die PreferredSize spannend, nicht die Size an sich, falls im JPanel gesetzt 
die wird evtl. sogar noch vom JScrollPane überschrieben


----------



## davidh38 (11. Okt 2011)

SlaterB hat gesagt.:


> in erster Linie an zu wenig geposteten Code,
> 
> wenn du paintComponent im JPanel überschreibst, dann kann Swing daraus nicht automatisch ableiten was du dir als Größe wünschst,
> setze setPreferredSize() !
> ...



also, egal, was ich mache ein ScrollPane kommt nicht zum Vorschein. Bitte schaut euch das nochmal an.


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class ScrollPane extends JPanel {

	public static void main (String [] args){
	
		
		JFrame jFrame = new JFrame("test");
		
		ScrollPane s = new ScrollPane();
		JScrollPane myScrollPane = new JScrollPane(s);
		jFrame.add(myScrollPane);
		jFrame.setPreferredSize(new Dimension(300,300));
		jFrame.setVisible(true);
		
		
	}
		public void paintComponent(Graphics g) {
		super.paintComponent(g);


		for (int i = 0; i <1000; i++) {
			for (int j = 0; j < 1000;j++){
				g.setColor(new Color(200, 100, 20));
				g.fillRect( i,  j, 1, 1);
			}

		}

	}	
	
	
	
}
```


----------



## SlaterB (11. Okt 2011)

das JFrame braucht keine PreferredSize, eher eine Size, die gibst du fest vor,

du musst festlegen wie groß das ScrollPane sein soll, von deren Größe hängen doch die Scrollbars ab,
s.setPreferredSize(new Dimension(300,300));
und die Scrollbalken erscheinen falls das JFrame nicht zu groß wird


----------



## jgh (11. Okt 2011)

neben dem schon erwähnten, zwei kleine Zusätze:
Deine Klasse sollte nicht den Namen einer Klasse des JDK haben, also bspw. MyScrollPanel anstelle von ScrollPane, die es im java.awt package schon gibt.
Und außerdem solltest du bei einem solchen Programm immer die DefaultCloseOperation definieren.

Nebenbei braucht deine paintComponet auf meinem Rechner immer deutlich über 2 sek, was bei deinem Code aber auch kein Wunder ist...du zeichnest 1.000.000 x 1Pixel mit der selben Color!!!
Die ScrollBalken sind dann nicht das prob...nur die Reaktionszeit


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class MyScrollPane extends JPanel {
	public MyScrollPane() {
		setPreferredSize(new Dimension(800, 800));
	}

	public static void main(String[] args) {

		JFrame jFrame = new JFrame("test");

		MyScrollPane s = new MyScrollPane();
		JScrollPane jScrollPane = new JScrollPane(s);
		jFrame.getContentPane().add(jScrollPane);
		jFrame.setSize(new Dimension(300, 300));
		jFrame.setLocationRelativeTo(null);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jFrame.setVisible(true);

	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		long period = System.nanoTime();
		for (int i = 0; i < 1000; i++) {
			for (int j = 0; j < 1000; j++) {
				g.setColor(new Color(200, 100, 20));
				g.fillRect(i, j, 1, 1);
			}
		}
		period = System.nanoTime() - period;
		System.out.println("t for paintComponent= " + (period / 1000000)
				+ " ms=");
	}
}
```


----------



## Xeonkryptos (11. Okt 2011)

Damit du deine Scrollpane siehst, musst du dieser einer setPreferredSize() mitgeben, sonst wird sie dir einfach nicht angezeigt. Ich weiß das... ich hatte das Prob mal auch


----------



## SlaterB (11. Okt 2011)

nein nein nein, die Scrollpane wird in das ContentPane eingefügt, welches BorderLayout hat, damit wird das ScrollPane maximiert,
PreferredSize dieser Komponente ist egal,

da gibts schon feine Details zu beachten


----------



## davidh38 (11. Okt 2011)

SlaterB hat gesagt.:


> nein nein nein, die Scrollpane wird in das ContentPane eingefügt, welches BorderLayout hat, damit wird das ScrollPane maximiert,
> PreferredSize dieser Komponente ist egal,
> 
> da gibts schon feine Details zu beachten



verstehe ich das jetzt richtig, dass wenn ich ein Pixelbild von 1000x1000 habe, die prefferedSize des ScrollPanes so setzen soll:

s.setPrefferedSize(new Dimension(1000,1000));

Wäre das so der "normale" Weg?


----------



## SlaterB (11. Okt 2011)

nein nein nein nochmal, bin ich mal wieder so undeutlich? 

- das JFrame braucht irgendeine Size die direkt die Anzeige bestimmt, sonst ziemlich klein am Anfang, kann aber vergrößert werden,
- das JScrollPane füllt im aktuellen Layoutaufbau immer das JFrame komplett, da bringt PreferredSize nix
- es geht die ganze Zeit um das JPanel, dieses ist im JScrollPane drin, das JScrollPane muss wissen wie groß das JPanel ist, damit es ausrechnen kann welchen Bereich es anzeigt, wie groß die ScrollBars werden usw.

bzw. du hast es ja schon verstanden, wie ich jetzt sehe, ist nur ein Problem mit schlechten Klassennamen,
> s.setPrefferedSize(new Dimension(1000,1000));
ja genau, einfach ausprobieren vor der Nachfrage ist auch erlaubt 

Xeonkryptos meinte das vielleicht auch, habe ich dann ebenso falsch verstanden


----------



## davidh38 (11. Okt 2011)

SlaterB hat gesagt.:


> nein nein nein nochmal, bin ich mal wieder so undeutlich?
> 
> - das JFrame braucht irgendeine Size die direkt die Anzeige bestimmt, sonst ziemlich klein am Anfang, kann aber vergrößert werden,
> - das JScrollPane füllt im aktuellen Layoutaufbau immer das JFrame komplett, da bringt PreferredSize nix
> ...



Warum funktioniert folgendes nicht? Gibt es vielleicht geringfügige Änderungen, die ich mache kann, damit ich den folgenden Code laufen lassen kann?


```
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class ScrollPane extends JPanel {

	public static void main (String [] args){
	
		ScrollPane s = new ScrollPane();
		s.visualize();
	

	}	
	
public void visualize(){
	JFrame jFrame = new JFrame("test");
	
//	ScrollPane s = new ScrollPane();
//	s.setPreferredSize(new Dimension(300,300));
	JScrollPane myScrollPane = new JScrollPane(this);
	jFrame.add(myScrollPane);
	jFrame.setPreferredSize(new Dimension(300,300));
	jFrame.setVisible(true);
	
	
}
	public void paintComponent(Graphics g) {
	super.paintComponent(g);


	for (int i = 0; i <1000; i++) {
		for (int j = 0; j < 1000;j++){
			g.setColor(new Color(200, 100, 20));
			g.fillRect( i,  j, 1, 1);
		}

	}
}
	
}
```


----------



## SlaterB (11. Okt 2011)

ja, endlich den setPreferredSize()-Aufruf reinnehmen von dem ich die ganze Zeit spreche?
dieser Thread hier ist noch mein Ende 

Zeile 24 wieder aufnehmen, das s. am Anfang natürlich weg, 

fürs JFrame bringt wie gesagt bzw. wie man testen kann setPreferredSize() nix, wenn dann setSize() sinnvoll,
wenn alles bei 300 liegt, dann ist natürlich nicht so viel zu scrollen, 
du hast ja selber vorher schon 1000x1000 angedacht für das JPanel, also für Zeile 24, denn in dem Panel wird ja auch derart viel gemalt,

das painten sollte wie gesagt wurde optimiert werden, so wie bisher ist ausprobieren, z.B. scrollen, gewiss keine Freude,
mit fillRect() kann man auch in einem Befehl 1000x1000 malen


----------



## davidh38 (12. Okt 2011)

SlaterB hat gesagt.:


> ja, endlich den setPreferredSize()-Aufruf reinnehmen von dem ich die ganze Zeit spreche?
> dieser Thread hier ist noch mein Ende
> 
> Zeile 24 wieder aufnehmen, das s. am Anfang natürlich weg,
> ...



Was soll ich sagen? Danke für dein Geduld und deine Hilfe :toll:


----------

