Avatar billede fredand Forsker
08. december 2004 - 11:45 Der er 5 kommentarer og
1 løsning

How to update a JScrollPane?

Hello!

I try to write a small Image viewer in Java where I should be able to view images and do some small adjustments.

When my app starts there should be no image loaded at all. But when I load it and the image is bigger then the JscrollPane I would like to have the scrolls. But in some how they will not be updated.

I use a ImagePanel of my own beacuse I need to do som adjustments. Se code below.

I create my JScrollPane like:
ImagePanel imagePanel = new ImagePanel();
JScrollPane jscrollPane = new JScrollPane(imagePanel, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

I load a new Image like:
public void open()
{
    try
    {
        JFileChooser fileChooser = new JFileChooser(".");
        fileChooser.setDialogType(JFileChooser.OPEN_DIALOG);
        fileChooser.setMultiSelectionEnabled(false);

        if(JFileChooser.APPROVE_OPTION == fileChooser.showOpenDialog(this))
        {
            if(fileChooser.getSelectedFile() != null)
            {
                Image jpg = getToolkit().getImage(fileChooser.getSelectedFile().getPath());

                MediaTracker mediaTracker = new MediaTracker(this);
                try
                {
                    mediaTracker.addImage(jpg, 0);

                    mediaTracker.waitForID(0);
                }
                catch(InterruptedException ie)
                {
                }

                imagePanel = new ImagePanel(jpg);

                jscrollPane.setViewportView(imagePanel);

            }
        }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

...But the scrollbars refuse to be updated.

So if any one know how to solve this. BTW I do have to use the ImagePanel!

Best regards
Fredrik

My code for the ImagePanel looks like:
import java.awt.*;
import java.applet.*;
import javax.swing.*;
import java.awt.image.*;

public class ImagePanel extends JPanel
{
    private Image jpg;
    private Image resultImage;

    private BleachFilter bleachFilter = new BleachFilter(1.5);
    private DarkFilter darkFilter = new DarkFilter(1.5);
    private NegativeFilter negativeFilter = new NegativeFilter();
    private int[] pixels = new int[300 * 300];

    public ImagePanel()
    {
        super();

        resultImage = null;
        jpg = null;
        setBackground(new Color(255, 255, 255));
    }

    public ImagePanel(Image j)
    {
        super();

        resultImage = j;
        jpg = j;
        setBackground(new Color(0, 0, 0));
        setSize(j.getWidth(this), j.getHeight(this));

        System.out.println(j.getWidth(this) + " " + j.getHeight(this));
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D graphics2D = (Graphics2D)g;
        if(resultImage != null)
        {
            graphics2D.drawImage(resultImage, 0, 0, this);
        }
    }

    public void setFilter(int i)
    {
        if(i == 0)
        {
            resultImage = jpg;
        }
        if(i == 1)
        {
            ImageProducer imageProducer = new FilteredImageSource( jpg.getSource(), bleachFilter);
            resultImage = createImage(imageProducer);
        }
        else if(i == 2)
        {
            ImageProducer imageProducer = new FilteredImageSource( jpg.getSource(), darkFilter);
            resultImage = createImage(imageProducer);
        }
        else if(i == 3)
        {
            ImageProducer imageProducer = jpg.getSource();
            NegativeFilter negativeFilter = new NegativeFilter();
            FilteredImageSource filteredImageSource = new FilteredImageSource(imageProducer, negativeFilter);
            resultImage = createImage(filteredImageSource);
        }

        repaint();
    }
}
Avatar billede _carsten Nybegynder
08. december 2004 - 11:50 #1
I don't know if validate() would work on a JScrollPane, but you could try it

myScrollPane.validate()
Avatar billede mikkelbm Nybegynder
08. december 2004 - 12:09 #2
What if you change this line:

setSize(j.getWidth(this), j.getHeight(this));

to:

setPreferredSize (j.getWidth(this), j.getHeight(this));

?

(Or maybe keep setSize and just add the setPreferredSize)
Avatar billede mikkelbm Nybegynder
08. december 2004 - 12:12 #3
Another option:

Extend from JLabel instead of JPanel and change your constructor to:

public ImagePanel(Image j)
{
        super();

        resultImage = j;
        jpg = j;
        setBackground(new Color(0, 0, 0));
        setIcon (new ImageIcon (j));

        System.out.println(j.getWidth(this) + " " + j.getHeight(this));
}
Avatar billede mikkelbm Nybegynder
08. december 2004 - 12:12 #4
And then skip your paintComponent(Graphics g)
Avatar billede fredand Forsker
08. december 2004 - 12:44 #5
Hello!

setPreferredSize tooke care of it!

Thanks!

Please give a svar so I could give you the points!
/Fredrik
Avatar billede mikkelbm Nybegynder
08. december 2004 - 12:45 #6
Svar...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester