repaint() nicht richtig?

Java123???

Mitglied
Guten Tag,
ich habe mir ein Programm geschrieben welches Bilder einlesen soll.
Das Bild wird während das Programm schon läuft in ein JPanel gezeichnet, damit ich dieses Bild scrollen kann, wenn es größer ist, liegt diese JPanel in einem JScrollPane.
Nachdem das Bild nun aber in das JPanel gezeichnet wurde und das Bild auch größer ist, müssten die ScrollBars erscheinen nun leider tun diese das erst wenn ich danach z.B. die Fenstergröße ändere. Deshalb wollte ich mal fragen wieso dies so ist und wie ich das richtig hinbekomme (mit repaint() müsste es doch eigentlich funktionieren, mehr wird bei dem Ändern der Fenstergröße doch auch nicht aufgerufen oder?).

Meine Quellcode:
Java:
public class Test extends JPanel {
    public static void main(String[] args) {
        new Test();
    }

    JFrame mainFrame;
    JScrollPane scrollPane;
    BufferedImage bild;
    public Test() {
        //frame
        mainFrame = new JFrame("Test");
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setPreferredSize(new Dimension(300, 200));

        //Menuebar
        JMenuBar menueBar = new JMenuBar();

        JMenu dateiMenue = new JMenu("Datei");
        menueBar.add(dateiMenue);

        JMenuItem oeffneDatei = new JMenuItem("Öffnen");
        dateiMenue.add(oeffneDatei);
        oeffneDatei.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    bild = ImageIO.read(getClass().getResource("img.jpg"));
                    repaint();
                } catch (IOException ex) {
                    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        mainFrame.setJMenuBar(menueBar);

        //komponenten zum frame adden
        setLayout(new BorderLayout());
        scrollPane = new JScrollPane(this);
        mainFrame.add(scrollPane);


        mainFrame.pack();
        mainFrame.setVisible(true);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if(bild!=null) {
            g.drawImage(bild, 0, 0, this);
            setPreferredSize(new Dimension(bild.getWidth(), bild.getHeight()));
        }
    }
}

Bild eingelesen, keine Scrollbars:
ek4ppyb7.gif


Größe des Fensters verändert, Scrollbars erscheinen:
3l5leg2v.gif
 
versuche validate() vor dem repaint(), das kümmert sich um Layout-Fragen wie Größen von Komponenten,
welche sich gewiss auf ScrollBars auswirken

idealerweise beide Methoden am JFrame mainFrame aufrufen, nicht am JPanel, einem Teil der GUI,
hier mag es reichen, JFrame als Chefebene ist das sicherste
 
Hallo java123???,

ich habe es jetzt nicht ausprobiert, könnte mir aber vorstellen,
dass das setPreferredSize in der paintComponent() zu spät kommt.
Versuche doch mal, die Größe direkt nach dem Einlesen des Bildes zu setzen.

VG ROlf
 
r.w. hat Recht: in der paintComponent-Methode sollte wenn möglich NUR gezeichnet werden, aber auf keinen Fall irgendwelche Änderungen an der Component gemacht werden (die ggf. wieder ein Neuzeichnen (und damit ein paintComponent) auslösen könnten ).
 
Ok, danke für danke für den Tipp, ich habe setPreferredSize jetzt aus der paintComponent() rausgenommen und es direkt nach dem Einlesen des Bildes aufgerufen, allerdings immernoch der gleiche Effekt und mit dem validate() habe ich es auch probiert, trotzdem leider alles wie vorher.
Habt ihr vielleicht noch eine Idee?

Mfg
 
du musst einfach:

Java:
	public void actionPerformed(ActionEvent e) {
				try {
					bild = ImageIO.read(getClass().getResource("img.jpg"));

					setPreferredSize(new Dimension(bild.getWidth(), bild
							.getHeight()));
					revalidate();
				} catch (IOException ex) {
					Logger.getLogger(Test.class.getName()).log(Level.SEVERE,
							null, ex);
				}
			}

revalidate aufrufen...zumindest klappt es so bei mir 😉
 

Zurück
Oben