Display an image on a JPanel

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

Display an image on a JPanel

Robert Lockwood
I've an application that collects a monochrome "image" as an array of
"unsigned short" (short[]), saves it as a TIFF (thanks for that help) and
displays it on JPanel.  I'd rather use the ImageJ methods etc. to display
the image on the JPanel and reduce my code.

Is this possible?  How?

Thanks,

Nate

--
When I was 12 I thought I would live forever.
So far, so good.

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

dscho
Hi Robert,

On Tue, 22 Oct 2013, Robert Lockwood wrote:

> I've an application that collects a monochrome "image" as an array of
> "unsigned short" (short[]), saves it as a TIFF (thanks for that help)
> and displays it on JPanel.  I'd rather use the ImageJ methods etc. to
> display the image on the JPanel and reduce my code.
>
> Is this possible?  How?

Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component intended to
display images -- is tightly bound to the ImageWindow class and does not
play well with other components in the same AWT container.

Besides, all the claims that AWT and Swing mix well now seem to be
premature still.

Therefore we integrated Simon Andrews' JImagePanel into Fiji:

https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java

It should be relatively easy to integrate into your software: it is
contained in the fiji-lib artifact available at http://maven.imagej.net/.

You could also extract the file and insert into your own source code, of
course, but you'd ask for diverging versions.

Ciao,
Johannes

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

Robert Lockwood
In order to have an ImagePanel for my application I downloaded the
JImagePanel from GitHub in response to Johannes reply, created a class for
it in my project changing the package to my package in Eclipse Keppler.

In my GUI initialization where the GUI is built I have:

        jImagePanel = new JImagePanel();
        jImagePanel.setName("jImagePanel");
        jImagePanel.setBorder(new LineBorder(new Color(0, 0, 0)));
        jImagePanel.setBounds(10, 10, 641, 481);
        jImagePanel.setBackground(Color.WHITE);
        jImagePanel.setOpaque(false);
        pnlBase.add(jImagePanel);

when the image is read I display it with:

        if (!jImagePanel.isOpaque()) {
            jImagePanel.setOpaque(true);
        }

        jImagePanel.updateImage(imp);

When I shift from Source to Design Google Builder crashes indicating
problems in JImagePanel's method paintCompnent().

When I attempt to run it the GUI does not display properly, the contents of
the JFrame are gray.  Moving the cursor over the contents exposes all the
JButtons, but nothing else, and clicking on the button results in the
expected display of my file selector.  If the file is selected the image
displays correctly as do all the other visual objects in the JFrame.

I get NullPointerException errors that finger the same line that trying to
move to Display fingers.

I modified the below code to check that imp was not null but it had no
effect.

Johannes gave another URL for the code but I don't know how to get that
code.

I guess I'm partway there ...

From JImagePanel:

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        try {
            if (imageUpdated) {
                imageUpdated = false;
                imp.updateImage();
            }
            Java2.setBilinearInterpolation(g,
Prefs.interpolateScaledImages);

            Image img = imp.getProcessor().createImage();  // THIS IS THE
ERROR LINE

            if (img != null) {
                waitForImage(img);
                int displayWidth = (int) (srcRect.width * magnification);
                int displayHeight = (int) (srcRect.height * magnification);
                Dimension size = getSize();
                int offsetX = (size.width - displayWidth) / 2;
                int offsetY = (size.height - displayHeight) / 2;
                g.translate(offsetX, offsetY);
                g.drawImage(img, 0, 0, displayWidth, displayHeight,
srcRect.x,
                        srcRect.y, srcRect.x + srcRect.width, srcRect.y
                                + srcRect.height, null);
            }
            drawOverlay(g);
        } catch (OutOfMemoryError e) {
            IJ.outOfMemory("Paint");
        }
    }




On Wed, Oct 23, 2013 at 7:31 AM, Johannes Schindelin <
[hidden email]> wrote:

> Hi Robert,
>
> On Tue, 22 Oct 2013, Robert Lockwood wrote:
>
> > I've an application that collects a monochrome "image" as an array of
> > "unsigned short" (short[]), saves it as a TIFF (thanks for that help)
> > and displays it on JPanel.  I'd rather use the ImageJ methods etc. to
> > display the image on the JPanel and reduce my code.
> >
> > Is this possible?  How?
>
> Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component intended to
> display images -- is tightly bound to the ImageWindow class and does not
> play well with other components in the same AWT container.
>
> Besides, all the claims that AWT and Swing mix well now seem to be
> premature still.
>
> Therefore we integrated Simon Andrews' JImagePanel into Fiji:
>
>
> https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java
>
> It should be relatively easy to integrate into your software: it is
> contained in the fiji-lib artifact available at http://maven.imagej.net/.
>
> You could also extract the file and insert into your own source code, of
> course, but you'd ask for diverging versions.
>
> Ciao,
> Johannes
>



--
When I was 12 I thought I would live forever.
So far, so good.

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

ctrueden
Hi Robert,

Can you please post a complete example demonstrating the problem?
GitHub.com is a nice place to do this. It will make it much easier for
people to help you.

Regards,
Curtis


On Thu, Oct 24, 2013 at 12:25 PM, Robert Lockwood <[hidden email]>wrote:

> In order to have an ImagePanel for my application I downloaded the
> JImagePanel from GitHub in response to Johannes reply, created a class for
> it in my project changing the package to my package in Eclipse Keppler.
>
> In my GUI initialization where the GUI is built I have:
>
>         jImagePanel = new JImagePanel();
>         jImagePanel.setName("jImagePanel");
>         jImagePanel.setBorder(new LineBorder(new Color(0, 0, 0)));
>         jImagePanel.setBounds(10, 10, 641, 481);
>         jImagePanel.setBackground(Color.WHITE);
>         jImagePanel.setOpaque(false);
>         pnlBase.add(jImagePanel);
>
> when the image is read I display it with:
>
>         if (!jImagePanel.isOpaque()) {
>             jImagePanel.setOpaque(true);
>         }
>
>         jImagePanel.updateImage(imp);
>
> When I shift from Source to Design Google Builder crashes indicating
> problems in JImagePanel's method paintCompnent().
>
> When I attempt to run it the GUI does not display properly, the contents of
> the JFrame are gray.  Moving the cursor over the contents exposes all the
> JButtons, but nothing else, and clicking on the button results in the
> expected display of my file selector.  If the file is selected the image
> displays correctly as do all the other visual objects in the JFrame.
>
> I get NullPointerException errors that finger the same line that trying to
> move to Display fingers.
>
> I modified the below code to check that imp was not null but it had no
> effect.
>
> Johannes gave another URL for the code but I don't know how to get that
> code.
>
> I guess I'm partway there ...
>
> From JImagePanel:
>
>     @Override
>     public void paintComponent(Graphics g) {
>         super.paintComponent(g);
>         try {
>             if (imageUpdated) {
>                 imageUpdated = false;
>                 imp.updateImage();
>             }
>             Java2.setBilinearInterpolation(g,
> Prefs.interpolateScaledImages);
>
>             Image img = imp.getProcessor().createImage();  // THIS IS THE
> ERROR LINE
>
>             if (img != null) {
>                 waitForImage(img);
>                 int displayWidth = (int) (srcRect.width * magnification);
>                 int displayHeight = (int) (srcRect.height * magnification);
>                 Dimension size = getSize();
>                 int offsetX = (size.width - displayWidth) / 2;
>                 int offsetY = (size.height - displayHeight) / 2;
>                 g.translate(offsetX, offsetY);
>                 g.drawImage(img, 0, 0, displayWidth, displayHeight,
> srcRect.x,
>                         srcRect.y, srcRect.x + srcRect.width, srcRect.y
>                                 + srcRect.height, null);
>             }
>             drawOverlay(g);
>         } catch (OutOfMemoryError e) {
>             IJ.outOfMemory("Paint");
>         }
>     }
>
>
>
>
> On Wed, Oct 23, 2013 at 7:31 AM, Johannes Schindelin <
> [hidden email]> wrote:
>
> > Hi Robert,
> >
> > On Tue, 22 Oct 2013, Robert Lockwood wrote:
> >
> > > I've an application that collects a monochrome "image" as an array of
> > > "unsigned short" (short[]), saves it as a TIFF (thanks for that help)
> > > and displays it on JPanel.  I'd rather use the ImageJ methods etc. to
> > > display the image on the JPanel and reduce my code.
> > >
> > > Is this possible?  How?
> >
> > Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component intended to
> > display images -- is tightly bound to the ImageWindow class and does not
> > play well with other components in the same AWT container.
> >
> > Besides, all the claims that AWT and Swing mix well now seem to be
> > premature still.
> >
> > Therefore we integrated Simon Andrews' JImagePanel into Fiji:
> >
> >
> >
> https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java
> >
> > It should be relatively easy to integrate into your software: it is
> > contained in the fiji-lib artifact available at http://maven.imagej.net/
> .
> >
> > You could also extract the file and insert into your own source code, of
> > course, but you'd ask for diverging versions.
> >
> > Ciao,
> > Johannes
> >
>
>
>
> --
> When I was 12 I thought I would live forever.
> So far, so good.
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

Robert Lockwood
Thanks Curtis, I have minimal code that re-creates the problem with an
application class, TestApp, and a single class, JImagePanel.

I have no idea how to get them into github.  I've never had any cooperators
with whom to collaborate so I'm absolutely ignorant of how to use github.


On Thu, Oct 24, 2013 at 11:10 AM, Curtis Rueden <[hidden email]> wrote:

> Hi Robert,
>
> Can you please post a complete example demonstrating the problem?
> GitHub.com is a nice place to do this. It will make it much easier for
> people to help you.
>
> Regards,
> Curtis
>
>
> On Thu, Oct 24, 2013 at 12:25 PM, Robert Lockwood <[hidden email]
> >wrote:
>
> > In order to have an ImagePanel for my application I downloaded the
> > JImagePanel from GitHub in response to Johannes reply, created a class
> for
> > it in my project changing the package to my package in Eclipse Keppler.
> >
> > In my GUI initialization where the GUI is built I have:
> >
> >         jImagePanel = new JImagePanel();
> >         jImagePanel.setName("jImagePanel");
> >         jImagePanel.setBorder(new LineBorder(new Color(0, 0, 0)));
> >         jImagePanel.setBounds(10, 10, 641, 481);
> >         jImagePanel.setBackground(Color.WHITE);
> >         jImagePanel.setOpaque(false);
> >         pnlBase.add(jImagePanel);
> >
> > when the image is read I display it with:
> >
> >         if (!jImagePanel.isOpaque()) {
> >             jImagePanel.setOpaque(true);
> >         }
> >
> >         jImagePanel.updateImage(imp);
> >
> > When I shift from Source to Design Google Builder crashes indicating
> > problems in JImagePanel's method paintCompnent().
> >
> > When I attempt to run it the GUI does not display properly, the contents
> of
> > the JFrame are gray.  Moving the cursor over the contents exposes all the
> > JButtons, but nothing else, and clicking on the button results in the
> > expected display of my file selector.  If the file is selected the image
> > displays correctly as do all the other visual objects in the JFrame.
> >
> > I get NullPointerException errors that finger the same line that trying
> to
> > move to Display fingers.
> >
> > I modified the below code to check that imp was not null but it had no
> > effect.
> >
> > Johannes gave another URL for the code but I don't know how to get that
> > code.
> >
> > I guess I'm partway there ...
> >
> > From JImagePanel:
> >
> >     @Override
> >     public void paintComponent(Graphics g) {
> >         super.paintComponent(g);
> >         try {
> >             if (imageUpdated) {
> >                 imageUpdated = false;
> >                 imp.updateImage();
> >             }
> >             Java2.setBilinearInterpolation(g,
> > Prefs.interpolateScaledImages);
> >
> >             Image img = imp.getProcessor().createImage();  // THIS IS THE
> > ERROR LINE
> >
> >             if (img != null) {
> >                 waitForImage(img);
> >                 int displayWidth = (int) (srcRect.width * magnification);
> >                 int displayHeight = (int) (srcRect.height *
> magnification);
> >                 Dimension size = getSize();
> >                 int offsetX = (size.width - displayWidth) / 2;
> >                 int offsetY = (size.height - displayHeight) / 2;
> >                 g.translate(offsetX, offsetY);
> >                 g.drawImage(img, 0, 0, displayWidth, displayHeight,
> > srcRect.x,
> >                         srcRect.y, srcRect.x + srcRect.width, srcRect.y
> >                                 + srcRect.height, null);
> >             }
> >             drawOverlay(g);
> >         } catch (OutOfMemoryError e) {
> >             IJ.outOfMemory("Paint");
> >         }
> >     }
> >
> >
> >
> >
> > On Wed, Oct 23, 2013 at 7:31 AM, Johannes Schindelin <
> > [hidden email]> wrote:
> >
> > > Hi Robert,
> > >
> > > On Tue, 22 Oct 2013, Robert Lockwood wrote:
> > >
> > > > I've an application that collects a monochrome "image" as an array of
> > > > "unsigned short" (short[]), saves it as a TIFF (thanks for that help)
> > > > and displays it on JPanel.  I'd rather use the ImageJ methods etc. to
> > > > display the image on the JPanel and reduce my code.
> > > >
> > > > Is this possible?  How?
> > >
> > > Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component intended to
> > > display images -- is tightly bound to the ImageWindow class and does
> not
> > > play well with other components in the same AWT container.
> > >
> > > Besides, all the claims that AWT and Swing mix well now seem to be
> > > premature still.
> > >
> > > Therefore we integrated Simon Andrews' JImagePanel into Fiji:
> > >
> > >
> > >
> >
> https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java
> > >
> > > It should be relatively easy to integrate into your software: it is
> > > contained in the fiji-lib artifact available at
> http://maven.imagej.net/
> > .
> > >
> > > You could also extract the file and insert into your own source code,
> of
> > > course, but you'd ask for diverging versions.
> > >
> > > Ciao,
> > > Johannes
> > >
> >
> >
> >
> > --
> > When I was 12 I thought I would live forever.
> > So far, so good.
> >
> > --
> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> >
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>



--
When I was 12 I thought I would live forever.
So far, so good.

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

Robert Lockwood
I found the error, the JPanel that the JImagePanel was added to had a
layout set to null, when I commented out that line the errors went away but
my GUI is messed up.  Some how there was a design error that didn't show
until I tried to add the JImagePanel or I screwed something up ...

Thanks Curtis and Johannes.


On Thu, Oct 24, 2013 at 12:39 PM, Robert Lockwood <[hidden email]>wrote:

> Thanks Curtis, I have minimal code that re-creates the problem with an
> application class, TestApp, and a single class, JImagePanel.
>
> I have no idea how to get them into github.  I've never had any
> cooperators with whom to collaborate so I'm absolutely ignorant of how to
> use github.
>
>
> On Thu, Oct 24, 2013 at 11:10 AM, Curtis Rueden <[hidden email]> wrote:
>
>> Hi Robert,
>>
>> Can you please post a complete example demonstrating the problem?
>> GitHub.com is a nice place to do this. It will make it much easier for
>> people to help you.
>>
>> Regards,
>> Curtis
>>
>>
>> On Thu, Oct 24, 2013 at 12:25 PM, Robert Lockwood <[hidden email]
>> >wrote:
>>
>> > In order to have an ImagePanel for my application I downloaded the
>> > JImagePanel from GitHub in response to Johannes reply, created a class
>> for
>> > it in my project changing the package to my package in Eclipse Keppler.
>> >
>> > In my GUI initialization where the GUI is built I have:
>> >
>> >         jImagePanel = new JImagePanel();
>> >         jImagePanel.setName("jImagePanel");
>> >         jImagePanel.setBorder(new LineBorder(new Color(0, 0, 0)));
>> >         jImagePanel.setBounds(10, 10, 641, 481);
>> >         jImagePanel.setBackground(Color.WHITE);
>> >         jImagePanel.setOpaque(false);
>> >         pnlBase.add(jImagePanel);
>> >
>> > when the image is read I display it with:
>> >
>> >         if (!jImagePanel.isOpaque()) {
>> >             jImagePanel.setOpaque(true);
>> >         }
>> >
>> >         jImagePanel.updateImage(imp);
>> >
>> > When I shift from Source to Design Google Builder crashes indicating
>> > problems in JImagePanel's method paintCompnent().
>> >
>> > When I attempt to run it the GUI does not display properly, the
>> contents of
>> > the JFrame are gray.  Moving the cursor over the contents exposes all
>> the
>> > JButtons, but nothing else, and clicking on the button results in the
>> > expected display of my file selector.  If the file is selected the image
>> > displays correctly as do all the other visual objects in the JFrame.
>> >
>> > I get NullPointerException errors that finger the same line that trying
>> to
>> > move to Display fingers.
>> >
>> > I modified the below code to check that imp was not null but it had no
>> > effect.
>> >
>> > Johannes gave another URL for the code but I don't know how to get that
>> > code.
>> >
>> > I guess I'm partway there ...
>> >
>> > From JImagePanel:
>> >
>> >     @Override
>> >     public void paintComponent(Graphics g) {
>> >         super.paintComponent(g);
>> >         try {
>> >             if (imageUpdated) {
>> >                 imageUpdated = false;
>> >                 imp.updateImage();
>> >             }
>> >             Java2.setBilinearInterpolation(g,
>> > Prefs.interpolateScaledImages);
>> >
>> >             Image img = imp.getProcessor().createImage();  // THIS IS
>> THE
>> > ERROR LINE
>> >
>> >             if (img != null) {
>> >                 waitForImage(img);
>> >                 int displayWidth = (int) (srcRect.width *
>> magnification);
>> >                 int displayHeight = (int) (srcRect.height *
>> magnification);
>> >                 Dimension size = getSize();
>> >                 int offsetX = (size.width - displayWidth) / 2;
>> >                 int offsetY = (size.height - displayHeight) / 2;
>> >                 g.translate(offsetX, offsetY);
>> >                 g.drawImage(img, 0, 0, displayWidth, displayHeight,
>> > srcRect.x,
>> >                         srcRect.y, srcRect.x + srcRect.width, srcRect.y
>> >                                 + srcRect.height, null);
>> >             }
>> >             drawOverlay(g);
>> >         } catch (OutOfMemoryError e) {
>> >             IJ.outOfMemory("Paint");
>> >         }
>> >     }
>> >
>> >
>> >
>> >
>> > On Wed, Oct 23, 2013 at 7:31 AM, Johannes Schindelin <
>> > [hidden email]> wrote:
>> >
>> > > Hi Robert,
>> > >
>> > > On Tue, 22 Oct 2013, Robert Lockwood wrote:
>> > >
>> > > > I've an application that collects a monochrome "image" as an array
>> of
>> > > > "unsigned short" (short[]), saves it as a TIFF (thanks for that
>> help)
>> > > > and displays it on JPanel.  I'd rather use the ImageJ methods etc.
>> to
>> > > > display the image on the JPanel and reduce my code.
>> > > >
>> > > > Is this possible?  How?
>> > >
>> > > Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component intended
>> to
>> > > display images -- is tightly bound to the ImageWindow class and does
>> not
>> > > play well with other components in the same AWT container.
>> > >
>> > > Besides, all the claims that AWT and Swing mix well now seem to be
>> > > premature still.
>> > >
>> > > Therefore we integrated Simon Andrews' JImagePanel into Fiji:
>> > >
>> > >
>> > >
>> >
>> https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java
>> > >
>> > > It should be relatively easy to integrate into your software: it is
>> > > contained in the fiji-lib artifact available at
>> http://maven.imagej.net/
>> > .
>> > >
>> > > You could also extract the file and insert into your own source code,
>> of
>> > > course, but you'd ask for diverging versions.
>> > >
>> > > Ciao,
>> > > Johannes
>> > >
>> >
>> >
>> >
>> > --
>> > When I was 12 I thought I would live forever.
>> > So far, so good.
>> >
>> > --
>> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>> >
>>
>> --
>> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>>
>
>
>
> --
> When I was 12 I thought I would live forever.
> So far, so good.
>



--
When I was 12 I thought I would live forever.
So far, so good.

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

ctrueden
In reply to this post by Robert Lockwood
Hi Robert,

> I have no idea how to get them into github.  I've never had any
> cooperators with whom to collaborate so I'm absolutely ignorant of how
> to use github.

Another option is to just ZIP it up and post it online somewhere, such a
server you control. Or if you have Dropbox, you can put it there and share
the link. Whatever works for you!

Regards,
Curtis


On Thu, Oct 24, 2013 at 2:39 PM, Robert Lockwood <[hidden email]>wrote:

> Thanks Curtis, I have minimal code that re-creates the problem with an
> application class, TestApp, and a single class, JImagePanel.
>
> I have no idea how to get them into github.  I've never had any cooperators
> with whom to collaborate so I'm absolutely ignorant of how to use github.
>
>
> On Thu, Oct 24, 2013 at 11:10 AM, Curtis Rueden <[hidden email]> wrote:
>
> > Hi Robert,
> >
> > Can you please post a complete example demonstrating the problem?
> > GitHub.com is a nice place to do this. It will make it much easier for
> > people to help you.
> >
> > Regards,
> > Curtis
> >
> >
> > On Thu, Oct 24, 2013 at 12:25 PM, Robert Lockwood <[hidden email]
> > >wrote:
> >
> > > In order to have an ImagePanel for my application I downloaded the
> > > JImagePanel from GitHub in response to Johannes reply, created a class
> > for
> > > it in my project changing the package to my package in Eclipse Keppler.
> > >
> > > In my GUI initialization where the GUI is built I have:
> > >
> > >         jImagePanel = new JImagePanel();
> > >         jImagePanel.setName("jImagePanel");
> > >         jImagePanel.setBorder(new LineBorder(new Color(0, 0, 0)));
> > >         jImagePanel.setBounds(10, 10, 641, 481);
> > >         jImagePanel.setBackground(Color.WHITE);
> > >         jImagePanel.setOpaque(false);
> > >         pnlBase.add(jImagePanel);
> > >
> > > when the image is read I display it with:
> > >
> > >         if (!jImagePanel.isOpaque()) {
> > >             jImagePanel.setOpaque(true);
> > >         }
> > >
> > >         jImagePanel.updateImage(imp);
> > >
> > > When I shift from Source to Design Google Builder crashes indicating
> > > problems in JImagePanel's method paintCompnent().
> > >
> > > When I attempt to run it the GUI does not display properly, the
> contents
> > of
> > > the JFrame are gray.  Moving the cursor over the contents exposes all
> the
> > > JButtons, but nothing else, and clicking on the button results in the
> > > expected display of my file selector.  If the file is selected the
> image
> > > displays correctly as do all the other visual objects in the JFrame.
> > >
> > > I get NullPointerException errors that finger the same line that trying
> > to
> > > move to Display fingers.
> > >
> > > I modified the below code to check that imp was not null but it had no
> > > effect.
> > >
> > > Johannes gave another URL for the code but I don't know how to get that
> > > code.
> > >
> > > I guess I'm partway there ...
> > >
> > > From JImagePanel:
> > >
> > >     @Override
> > >     public void paintComponent(Graphics g) {
> > >         super.paintComponent(g);
> > >         try {
> > >             if (imageUpdated) {
> > >                 imageUpdated = false;
> > >                 imp.updateImage();
> > >             }
> > >             Java2.setBilinearInterpolation(g,
> > > Prefs.interpolateScaledImages);
> > >
> > >             Image img = imp.getProcessor().createImage();  // THIS IS
> THE
> > > ERROR LINE
> > >
> > >             if (img != null) {
> > >                 waitForImage(img);
> > >                 int displayWidth = (int) (srcRect.width *
> magnification);
> > >                 int displayHeight = (int) (srcRect.height *
> > magnification);
> > >                 Dimension size = getSize();
> > >                 int offsetX = (size.width - displayWidth) / 2;
> > >                 int offsetY = (size.height - displayHeight) / 2;
> > >                 g.translate(offsetX, offsetY);
> > >                 g.drawImage(img, 0, 0, displayWidth, displayHeight,
> > > srcRect.x,
> > >                         srcRect.y, srcRect.x + srcRect.width, srcRect.y
> > >                                 + srcRect.height, null);
> > >             }
> > >             drawOverlay(g);
> > >         } catch (OutOfMemoryError e) {
> > >             IJ.outOfMemory("Paint");
> > >         }
> > >     }
> > >
> > >
> > >
> > >
> > > On Wed, Oct 23, 2013 at 7:31 AM, Johannes Schindelin <
> > > [hidden email]> wrote:
> > >
> > > > Hi Robert,
> > > >
> > > > On Tue, 22 Oct 2013, Robert Lockwood wrote:
> > > >
> > > > > I've an application that collects a monochrome "image" as an array
> of
> > > > > "unsigned short" (short[]), saves it as a TIFF (thanks for that
> help)
> > > > > and displays it on JPanel.  I'd rather use the ImageJ methods etc.
> to
> > > > > display the image on the JPanel and reduce my code.
> > > > >
> > > > > Is this possible?  How?
> > > >
> > > > Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component intended
> to
> > > > display images -- is tightly bound to the ImageWindow class and does
> > not
> > > > play well with other components in the same AWT container.
> > > >
> > > > Besides, all the claims that AWT and Swing mix well now seem to be
> > > > premature still.
> > > >
> > > > Therefore we integrated Simon Andrews' JImagePanel into Fiji:
> > > >
> > > >
> > > >
> > >
> >
> https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java
> > > >
> > > > It should be relatively easy to integrate into your software: it is
> > > > contained in the fiji-lib artifact available at
> > http://maven.imagej.net/
> > > .
> > > >
> > > > You could also extract the file and insert into your own source code,
> > of
> > > > course, but you'd ask for diverging versions.
> > > >
> > > > Ciao,
> > > > Johannes
> > > >
> > >
> > >
> > >
> > > --
> > > When I was 12 I thought I would live forever.
> > > So far, so good.
> > >
> > > --
> > > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> > >
> >
> > --
> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> >
>
>
>
> --
> When I was 12 I thought I would live forever.
> So far, so good.
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

ctrueden
In reply to this post by Robert Lockwood
Hi Robert,

> the JPanel that the JImagePanel was added to had a layout set to null,
> when I commented out that line the errors went away

The default layout of a JPanel is FlowLayout, which personally is never
what I want. It tends to not work as expected in many situations.

I would suggest one of the following:

    myPanel.setLayout(new BorderLayout());
    myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.X_AXIS)); //
components go horizontally
    myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.Y_AXIS)); //
components go vertically

If all you want is the JImagePanel inside the JPanel and nothing else,
using BorderLayout is probably simplest. But there are many options:

    http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

My personal favorite layout manager for complex UIs is MigLayout (
http://www.miglayout.com/). It is flexible and powerful while remaining
fairly simple to use (unlike GridBagLayout). But it is a third party
library, not built in to the JDK.

Regards,
Curtis


On Thu, Oct 24, 2013 at 3:02 PM, Robert Lockwood <[hidden email]>wrote:

> I found the error, the JPanel that the JImagePanel was added to had a
> layout set to null, when I commented out that line the errors went away but
> my GUI is messed up.  Some how there was a design error that didn't show
> until I tried to add the JImagePanel or I screwed something up ...
>
> Thanks Curtis and Johannes.
>
>
> On Thu, Oct 24, 2013 at 12:39 PM, Robert Lockwood <[hidden email]
> >wrote:
>
> > Thanks Curtis, I have minimal code that re-creates the problem with an
> > application class, TestApp, and a single class, JImagePanel.
> >
> > I have no idea how to get them into github.  I've never had any
> > cooperators with whom to collaborate so I'm absolutely ignorant of how to
> > use github.
> >
> >
> > On Thu, Oct 24, 2013 at 11:10 AM, Curtis Rueden <[hidden email]>
> wrote:
> >
> >> Hi Robert,
> >>
> >> Can you please post a complete example demonstrating the problem?
> >> GitHub.com is a nice place to do this. It will make it much easier for
> >> people to help you.
> >>
> >> Regards,
> >> Curtis
> >>
> >>
> >> On Thu, Oct 24, 2013 at 12:25 PM, Robert Lockwood <[hidden email]
> >> >wrote:
> >>
> >> > In order to have an ImagePanel for my application I downloaded the
> >> > JImagePanel from GitHub in response to Johannes reply, created a class
> >> for
> >> > it in my project changing the package to my package in Eclipse
> Keppler.
> >> >
> >> > In my GUI initialization where the GUI is built I have:
> >> >
> >> >         jImagePanel = new JImagePanel();
> >> >         jImagePanel.setName("jImagePanel");
> >> >         jImagePanel.setBorder(new LineBorder(new Color(0, 0, 0)));
> >> >         jImagePanel.setBounds(10, 10, 641, 481);
> >> >         jImagePanel.setBackground(Color.WHITE);
> >> >         jImagePanel.setOpaque(false);
> >> >         pnlBase.add(jImagePanel);
> >> >
> >> > when the image is read I display it with:
> >> >
> >> >         if (!jImagePanel.isOpaque()) {
> >> >             jImagePanel.setOpaque(true);
> >> >         }
> >> >
> >> >         jImagePanel.updateImage(imp);
> >> >
> >> > When I shift from Source to Design Google Builder crashes indicating
> >> > problems in JImagePanel's method paintCompnent().
> >> >
> >> > When I attempt to run it the GUI does not display properly, the
> >> contents of
> >> > the JFrame are gray.  Moving the cursor over the contents exposes all
> >> the
> >> > JButtons, but nothing else, and clicking on the button results in the
> >> > expected display of my file selector.  If the file is selected the
> image
> >> > displays correctly as do all the other visual objects in the JFrame.
> >> >
> >> > I get NullPointerException errors that finger the same line that
> trying
> >> to
> >> > move to Display fingers.
> >> >
> >> > I modified the below code to check that imp was not null but it had no
> >> > effect.
> >> >
> >> > Johannes gave another URL for the code but I don't know how to get
> that
> >> > code.
> >> >
> >> > I guess I'm partway there ...
> >> >
> >> > From JImagePanel:
> >> >
> >> >     @Override
> >> >     public void paintComponent(Graphics g) {
> >> >         super.paintComponent(g);
> >> >         try {
> >> >             if (imageUpdated) {
> >> >                 imageUpdated = false;
> >> >                 imp.updateImage();
> >> >             }
> >> >             Java2.setBilinearInterpolation(g,
> >> > Prefs.interpolateScaledImages);
> >> >
> >> >             Image img = imp.getProcessor().createImage();  // THIS IS
> >> THE
> >> > ERROR LINE
> >> >
> >> >             if (img != null) {
> >> >                 waitForImage(img);
> >> >                 int displayWidth = (int) (srcRect.width *
> >> magnification);
> >> >                 int displayHeight = (int) (srcRect.height *
> >> magnification);
> >> >                 Dimension size = getSize();
> >> >                 int offsetX = (size.width - displayWidth) / 2;
> >> >                 int offsetY = (size.height - displayHeight) / 2;
> >> >                 g.translate(offsetX, offsetY);
> >> >                 g.drawImage(img, 0, 0, displayWidth, displayHeight,
> >> > srcRect.x,
> >> >                         srcRect.y, srcRect.x + srcRect.width,
> srcRect.y
> >> >                                 + srcRect.height, null);
> >> >             }
> >> >             drawOverlay(g);
> >> >         } catch (OutOfMemoryError e) {
> >> >             IJ.outOfMemory("Paint");
> >> >         }
> >> >     }
> >> >
> >> >
> >> >
> >> >
> >> > On Wed, Oct 23, 2013 at 7:31 AM, Johannes Schindelin <
> >> > [hidden email]> wrote:
> >> >
> >> > > Hi Robert,
> >> > >
> >> > > On Tue, 22 Oct 2013, Robert Lockwood wrote:
> >> > >
> >> > > > I've an application that collects a monochrome "image" as an array
> >> of
> >> > > > "unsigned short" (short[]), saves it as a TIFF (thanks for that
> >> help)
> >> > > > and displays it on JPanel.  I'd rather use the ImageJ methods etc.
> >> to
> >> > > > display the image on the JPanel and reduce my code.
> >> > > >
> >> > > > Is this possible?  How?
> >> > >
> >> > > Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component intended
> >> to
> >> > > display images -- is tightly bound to the ImageWindow class and does
> >> not
> >> > > play well with other components in the same AWT container.
> >> > >
> >> > > Besides, all the claims that AWT and Swing mix well now seem to be
> >> > > premature still.
> >> > >
> >> > > Therefore we integrated Simon Andrews' JImagePanel into Fiji:
> >> > >
> >> > >
> >> > >
> >> >
> >>
> https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java
> >> > >
> >> > > It should be relatively easy to integrate into your software: it is
> >> > > contained in the fiji-lib artifact available at
> >> http://maven.imagej.net/
> >> > .
> >> > >
> >> > > You could also extract the file and insert into your own source
> code,
> >> of
> >> > > course, but you'd ask for diverging versions.
> >> > >
> >> > > Ciao,
> >> > > Johannes
> >> > >
> >> >
> >> >
> >> >
> >> > --
> >> > When I was 12 I thought I would live forever.
> >> > So far, so good.
> >> >
> >> > --
> >> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> >> >
> >>
> >> --
> >> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> >>
> >
> >
> >
> > --
> > When I was 12 I thought I would live forever.
> > So far, so good.
> >
>
>
>
> --
> When I was 12 I thought I would live forever.
> So far, so good.
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html
Reply | Threaded
Open this post in threaded view
|

Re: Display an image on a JPanel

Robert Lockwood
<<
My personal favorite layout manager for complex UIs is MigLayout (
http://www.miglayout.com/). It is flexible and powerful while remaining
fairly simple to use (unlike GridBagLayout). But it is a third party
library, not built in to the JDK.
>>

Thanks, this application is a demo (and test bed for me) for one size of
image.  I can't resist adapting it for different image sizes from our
cameras.

I did figure out that the JImagePanel had to be in it's own panel but I
used flow layout, I'll experiment.

I can immediately see where I should be using mig layout (after following
your link) and I see that it is included in Eclipse Keppler.  I both use
Google Builder and code some of the display by hand.

Nate


On Thu, Oct 24, 2013 at 7:31 PM, Curtis Rueden <[hidden email]> wrote:

> Hi Robert,
>
> > the JPanel that the JImagePanel was added to had a layout set to null,
> > when I commented out that line the errors went away
>
> The default layout of a JPanel is FlowLayout, which personally is never
> what I want. It tends to not work as expected in many situations.
>
> I would suggest one of the following:
>
>     myPanel.setLayout(new BorderLayout());
>     myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.X_AXIS)); //
> components go horizontally
>     myPanel.setLayout(new BoxLayout(myPanel, BoxLayout.Y_AXIS)); //
> components go vertically
>
> If all you want is the JImagePanel inside the JPanel and nothing else,
> using BorderLayout is probably simplest. But there are many options:
>
>     http://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html
>
> My personal favorite layout manager for complex UIs is MigLayout (
> http://www.miglayout.com/). It is flexible and powerful while remaining
> fairly simple to use (unlike GridBagLayout). But it is a third party
> library, not built in to the JDK.
>
> Regards,
> Curtis
>
>
> On Thu, Oct 24, 2013 at 3:02 PM, Robert Lockwood <[hidden email]
> >wrote:
>
> > I found the error, the JPanel that the JImagePanel was added to had a
> > layout set to null, when I commented out that line the errors went away
> but
> > my GUI is messed up.  Some how there was a design error that didn't show
> > until I tried to add the JImagePanel or I screwed something up ...
> >
> > Thanks Curtis and Johannes.
> >
> >
> > On Thu, Oct 24, 2013 at 12:39 PM, Robert Lockwood <[hidden email]
> > >wrote:
> >
> > > Thanks Curtis, I have minimal code that re-creates the problem with an
> > > application class, TestApp, and a single class, JImagePanel.
> > >
> > > I have no idea how to get them into github.  I've never had any
> > > cooperators with whom to collaborate so I'm absolutely ignorant of how
> to
> > > use github.
> > >
> > >
> > > On Thu, Oct 24, 2013 at 11:10 AM, Curtis Rueden <[hidden email]>
> > wrote:
> > >
> > >> Hi Robert,
> > >>
> > >> Can you please post a complete example demonstrating the problem?
> > >> GitHub.com is a nice place to do this. It will make it much easier for
> > >> people to help you.
> > >>
> > >> Regards,
> > >> Curtis
> > >>
> > >>
> > >> On Thu, Oct 24, 2013 at 12:25 PM, Robert Lockwood <
> [hidden email]
> > >> >wrote:
> > >>
> > >> > In order to have an ImagePanel for my application I downloaded the
> > >> > JImagePanel from GitHub in response to Johannes reply, created a
> class
> > >> for
> > >> > it in my project changing the package to my package in Eclipse
> > Keppler.
> > >> >
> > >> > In my GUI initialization where the GUI is built I have:
> > >> >
> > >> >         jImagePanel = new JImagePanel();
> > >> >         jImagePanel.setName("jImagePanel");
> > >> >         jImagePanel.setBorder(new LineBorder(new Color(0, 0, 0)));
> > >> >         jImagePanel.setBounds(10, 10, 641, 481);
> > >> >         jImagePanel.setBackground(Color.WHITE);
> > >> >         jImagePanel.setOpaque(false);
> > >> >         pnlBase.add(jImagePanel);
> > >> >
> > >> > when the image is read I display it with:
> > >> >
> > >> >         if (!jImagePanel.isOpaque()) {
> > >> >             jImagePanel.setOpaque(true);
> > >> >         }
> > >> >
> > >> >         jImagePanel.updateImage(imp);
> > >> >
> > >> > When I shift from Source to Design Google Builder crashes indicating
> > >> > problems in JImagePanel's method paintCompnent().
> > >> >
> > >> > When I attempt to run it the GUI does not display properly, the
> > >> contents of
> > >> > the JFrame are gray.  Moving the cursor over the contents exposes
> all
> > >> the
> > >> > JButtons, but nothing else, and clicking on the button results in
> the
> > >> > expected display of my file selector.  If the file is selected the
> > image
> > >> > displays correctly as do all the other visual objects in the JFrame.
> > >> >
> > >> > I get NullPointerException errors that finger the same line that
> > trying
> > >> to
> > >> > move to Display fingers.
> > >> >
> > >> > I modified the below code to check that imp was not null but it had
> no
> > >> > effect.
> > >> >
> > >> > Johannes gave another URL for the code but I don't know how to get
> > that
> > >> > code.
> > >> >
> > >> > I guess I'm partway there ...
> > >> >
> > >> > From JImagePanel:
> > >> >
> > >> >     @Override
> > >> >     public void paintComponent(Graphics g) {
> > >> >         super.paintComponent(g);
> > >> >         try {
> > >> >             if (imageUpdated) {
> > >> >                 imageUpdated = false;
> > >> >                 imp.updateImage();
> > >> >             }
> > >> >             Java2.setBilinearInterpolation(g,
> > >> > Prefs.interpolateScaledImages);
> > >> >
> > >> >             Image img = imp.getProcessor().createImage();  // THIS
> IS
> > >> THE
> > >> > ERROR LINE
> > >> >
> > >> >             if (img != null) {
> > >> >                 waitForImage(img);
> > >> >                 int displayWidth = (int) (srcRect.width *
> > >> magnification);
> > >> >                 int displayHeight = (int) (srcRect.height *
> > >> magnification);
> > >> >                 Dimension size = getSize();
> > >> >                 int offsetX = (size.width - displayWidth) / 2;
> > >> >                 int offsetY = (size.height - displayHeight) / 2;
> > >> >                 g.translate(offsetX, offsetY);
> > >> >                 g.drawImage(img, 0, 0, displayWidth, displayHeight,
> > >> > srcRect.x,
> > >> >                         srcRect.y, srcRect.x + srcRect.width,
> > srcRect.y
> > >> >                                 + srcRect.height, null);
> > >> >             }
> > >> >             drawOverlay(g);
> > >> >         } catch (OutOfMemoryError e) {
> > >> >             IJ.outOfMemory("Paint");
> > >> >         }
> > >> >     }
> > >> >
> > >> >
> > >> >
> > >> >
> > >> > On Wed, Oct 23, 2013 at 7:31 AM, Johannes Schindelin <
> > >> > [hidden email]> wrote:
> > >> >
> > >> > > Hi Robert,
> > >> > >
> > >> > > On Tue, 22 Oct 2013, Robert Lockwood wrote:
> > >> > >
> > >> > > > I've an application that collects a monochrome "image" as an
> array
> > >> of
> > >> > > > "unsigned short" (short[]), saves it as a TIFF (thanks for that
> > >> help)
> > >> > > > and displays it on JPanel.  I'd rather use the ImageJ methods
> etc.
> > >> to
> > >> > > > display the image on the JPanel and reduce my code.
> > >> > > >
> > >> > > > Is this possible?  How?
> > >> > >
> > >> > > Unfortunately, the ImageCanvas -- ImageJ 1.x' AWT component
> intended
> > >> to
> > >> > > display images -- is tightly bound to the ImageWindow class and
> does
> > >> not
> > >> > > play well with other components in the same AWT container.
> > >> > >
> > >> > > Besides, all the claims that AWT and Swing mix well now seem to be
> > >> > > premature still.
> > >> > >
> > >> > > Therefore we integrated Simon Andrews' JImagePanel into Fiji:
> > >> > >
> > >> > >
> > >> > >
> > >> >
> > >>
> >
> https://github.com/fiji/fiji/blob/master/src-plugins/fiji-lib/src/main/java/fiji/util/gui/JImagePanel.java
> > >> > >
> > >> > > It should be relatively easy to integrate into your software: it
> is
> > >> > > contained in the fiji-lib artifact available at
> > >> http://maven.imagej.net/
> > >> > .
> > >> > >
> > >> > > You could also extract the file and insert into your own source
> > code,
> > >> of
> > >> > > course, but you'd ask for diverging versions.
> > >> > >
> > >> > > Ciao,
> > >> > > Johannes
> > >> > >
> > >> >
> > >> >
> > >> >
> > >> > --
> > >> > When I was 12 I thought I would live forever.
> > >> > So far, so good.
> > >> >
> > >> > --
> > >> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> > >> >
> > >>
> > >> --
> > >> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> > >>
> > >
> > >
> > >
> > > --
> > > When I was 12 I thought I would live forever.
> > > So far, so good.
> > >
> >
> >
> >
> > --
> > When I was 12 I thought I would live forever.
> > So far, so good.
> >
> > --
> > ImageJ mailing list: http://imagej.nih.gov/ij/list.html
> >
>
> --
> ImageJ mailing list: http://imagej.nih.gov/ij/list.html
>



--
When I was 12 I thought I would live forever.
So far, so good.

--
ImageJ mailing list: http://imagej.nih.gov/ij/list.html