Obrazek - dostosowywanie się (skalowanie) do aktualnych rozmiarów okna

0

Witam,

mój problem jest taki jak w temacie - chciałbym, żeby wgrany do panelu obrazek dopasowywał się do aktualnych rozmiarów okna (po zmianie za pomocą myszki).
Oto co do tej pory stworzyłem:

KLASA TWORZĄCA PANEL Z OBRAZKIEM:

package testobrazki;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.*;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JPanel;

public class Rysowanki extends JPanel
{
    private String nazwa;
    private Image img;
    private Image img2;

    public Rysowanki(String nazwa)
    {
        super();
        this.nazwa = nazwa;

    }

    @Override
public void addNotify() {
        super.addNotify();
        img = Toolkit.getDefaultToolkit().getImage(nazwa);
                img2 = img.getScaledInstance(this.getSize().width+1,this.getSize().height+1 , Image.SCALE_FAST);

//to +1 jest po to, bo bez tego wyrzuca błąd gdy ta ramka jest częścią większej aplikacji - wiem, metoda na chama

    }

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        g.drawImage(img2,0,0,null);

    }

}

MAIN - RAMKA

package testobrazki;

import java.awt.BorderLayout;
import java.awt.Dimension;

import java.awt.Toolkit;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JFrame;
public class Main extends JFrame {
     public Main()
    {
        initComponents();

        int szer = Toolkit.getDefaultToolkit().getScreenSize().width;
        int wys = Toolkit.getDefaultToolkit().getScreenSize().height;

        this.setSize(szer/2,wys/2);
        int szerRamki = this.getSize().width;
        int wysRamki = this.getSize().height;

        this.setLocation((szer - szerRamki)/2,(wys-wysRamki)/2);

        panel.setSize(this.getSize().width,this.getSize().height);

        this.getContentPane().add(BorderLayout.CENTER,panel);

    }

    private void initComponents() {
        this.setDefaultCloseOperation(3);

        this.addComponentListener(new ComponentAdapter() {
            @Override
        public void componentResized(ComponentEvent e) {
                int x = e.getComponent().getSize().width;
                int y = e.getComponent().getSize().height;

                System.out.println(x);
                System.out.println(y);
                panel.setSize(x, y);

                System.out.println(panel.getSize());

    }
        });

    }

     private Rysowanki panel = new Rysowanki("tlo.jpg");

    public static void main(String[] args) {
        new Main().setVisible(true);
    }

}

Próbowałem coś kombinować z repaint() albo revalidate(), ale dopiero zaczynam programować w Javie i nie udało mi się osiągnąć zamierzonych efektów.
Ponadto, obrazek czasami się wyświetla, a czasami nie - wtedy trzeba właśnie jakoś zmienić rozmiar okna, nie mam pojęcia o co chodzi.

Proszę o pomoc - walczę z tym już chyba 4 dzień, a na jutro musi to być zrobione...

Pozdrawiam,
Krzysiek.

0

Może spróbuj tak:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Program {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ImagePanel panel = new ImagePanel(new ImageIcon("D:\\1.jpg").getImage());

        JFrame frame = new JFrame();
        frame.getContentPane().add(panel);
        frame.pack();
        frame.setVisible(true);
    }

    public static class ImagePanel extends JPanel {
        private static final long serialVersionUID = 1L;
        private Image img;

        public ImagePanel(String img) {
            this(new ImageIcon(img).getImage());
        }

        public ImagePanel(Image img) {
            this.img = img;
            Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
            setPreferredSize(size);
            setMinimumSize(size);
            setMaximumSize(size);
            setSize(size);
            setLayout(null);
        }

        public void paintComponent(Graphics g) {
            g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
        }
    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0