# Auf ein JScrollPane zeichnen.



## Yoshi- (15. Apr 2011)

Ich benutze ein Imageicon auf ein JScrollPane und möchte darauf nun was zeichnen. Nur dabei habe ich ein Probleme. Das gezeichnete verschwindet, wenn man scrollt.

Mein derzeitiger Code(etwas gekürzt)

```
public class Map extends JFrame	implements MouseListener   {
		public JScrollPane jsp;
		
		public Map() {
			//Frame = new JFrame();
			
			this.setTitle("Test");
			this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
			
			JPanel panel1 = new JPanel();
			ImageIcon pic = new ImageIcon("image.jpg");
			
			jsp = new JScrollPane(new JLabel(pic));
			this.add(jsp);
			
			this.setSize(500, 500);
			jsp.addMouseListener(this); 
		}

		@Override 
		public void paint( Graphics g ) { 
			super.paint( g ); 
			g.drawString("Test", 300, 300);
		}
```


----------



## Marco13 (16. Apr 2011)

Da zeichnest du ja erstmal in den Frame (was man i.a. nicht machen sollte). ScrollPanes verwenden auch trickreiche Blitting-Techniken, um das Scrollen schneller zu machen. Warum zeichnest du nicht auf ein JPanel, das in der ScrollPane liegt? (Oder, wenn es nicht mit gescrollt werden soll, auf ein GlassPane)


----------



## Yoshi- (16. Apr 2011)

Wie genau soll ich das den machen? Bin nicht alzu gut mit Panels


----------



## Marco13 (16. Apr 2011)

Hast du schon sowas wie Malen in Swing Teil 1: der grundlegende Mechanismus - Byte-Welt Wiki gelesen? Die Frage ist so unspezifisch....


----------



## Yoshi- (17. Apr 2011)

Du sagtest ja, dass ich auf ein GlassPane zeichnen soll, das in den ScrollPane liegt, da weiß ich nicht wie ich das tue.

Außerdem, wäre es nicht auch möglich direkt auf das Imageicon bzw das Bild zuzeichnen?


----------



## Marco13 (17. Apr 2011)

Das mit dem GlassPane war für den Fall, dass das gemalte NICHT mitgescrollt werden soll. Das ist wohl hier nicht der Fall? (Klare Fragen zu stellen scheint schwieriger zu sein, als man manchmal denkt  )

Also, wenn auf das JPanel gemalt werden soll, das das ImageIcon enthält, und das alles insgesamt dann in einer ScrollPane rumgescrollt werden soll, dann könntest du sowas machen wie

```
class PaintPanel extends JPanel
{
        @Override 
        protected void paintComponent( Graphics g ) { 
            super.paintComponent( g ); 
            g.drawString("Test", 300, 300);
        }
}
```

und dann dort, wo du bisher das Panel erstellst eben sowas wie

```
JPanel panel1 = new PaintPanel();
            ImageIcon pic = new ImageIcon("image.jpg");
            panel1.setLayout(new GridLayout(1,1));
            panel1.add(new JLabel(pic));
            jsp = new JScrollPane(panel1);
```
... so in etwa... Wenn's nicht klappt, poste ein KSKB vom aktuellen Stand


----------



## Yoshi- (17. Apr 2011)

Ah gut danke

```
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class Map extends JFrame {
    public JScrollPane jsp;

    public JPanel panel1;
        
    public static void main(String[] args) {
        Map map = new Map();
    }

    public Map() {
        this.setTitle("Test");
        this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);

        panel1 = new PaintPanel();

        ImageIcon pic = new ImageIcon("Bild.jpg");

        panel1.setLayout(new GridLayout(1,1));
        panel1.add(new JLabel(pic));
        jsp = new JScrollPane(panel1);

        setSize(300, 250);
        //jsp.addMouseListener(this);
        this.add(jsp);
        this.setVisible(true);
    }


    class PaintPanel extends JPanel {
        @Override
        protected void paintComponent( Graphics g1 ) {
            super.paintComponent( g1 );
            Graphics2D g = (Graphics2D)g1;
            g.drawString("Test", 300, 300);
        }
    }
}
```

Das einzige problem ist jetzt, das Text wohl unterm Imageicon verschwindet, bzw wenn ich das ImageIcon rausnehme sehe ich den Text, wenn es drin ist nicht.


----------



## Marco13 (17. Apr 2011)

Was meinst du?

```
class PaintPanel extends JPanel {
        @Override
        protected void paintComponent( Graphics g1 ) {
            super.paintComponent( g1 );
            Graphics2D g = (Graphics2D)g1;
            g.setColor(Color.RED);
            g.drawString("Test", 10, 10);
            g.setColor(Color.WHITE);
            g.drawString("Test", 10, 20);
            g.setColor(Color.GREEN);
            g.drawString("Test", 10, 30);
            g.setColor(Color.BLACK);
            g.drawString("Test", 10, 40);
        }
    }
```


----------



## Yoshi- (17. Apr 2011)

Wie gesagt, wenn ich das Imageicon auskommentiere sieht es so aus:






Wenn ich es drin lasse so:





Danke für deine Hilfe.


----------



## Michael... (17. Apr 2011)

Zeichne das Bild ebenfalls in der paintComponent selbst, dann kannst Du die Reihenfolge bewusst festlegen.
siehe Graphics#drawImage(...)


----------



## Marco13 (17. Apr 2011)

Hoppala, ja, paintComponent kommt vor paintChildren  das wäre dann einer der wenigen Fälle, wo man wohl doch paint überschreiben würde

```
class PaintPanel extends JPanel {
        @Override
        public void paint( Graphics g1 ) {
            super.paint( g1 );
            Graphics2D g = (Graphics2D)g1;
            g.setColor(Color.RED);
            g.drawString("Test", 10, 10);
            g.setColor(Color.WHITE);
            g.drawString("Test", 10, 20);
            g.setColor(Color.GREEN);
            g.drawString("Test", 10, 30);
            g.setColor(Color.BLACK);
            g.drawString("Test", 10, 40);
        }
    }
```


----------



## Yoshi- (18. Apr 2011)

Ah gut mit paint funktioniert es.
Danke


----------

