JFrame jframe = new JFrame("Image");
JScrollPane scrollPane=new JScrolPane(this);
jframe.add(scrollPane);
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
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);
}
}
}
}
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=");
}
}
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
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
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);
}
}
}
}
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