Re: Display image selected from JFileChooser



In article
<8fe03a4a-cc5d-403d-baec-0e31d35ce3a0@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>,
jimmy <jimmy.cullen@xxxxxxxxx> wrote:

I have attached my new code. I would be most grateful if someone could
identify the problem and indicate how I could resolve it.

Again, Lew is more assiduous than I, and ilAn's advice will serve you
better in the long run; but I will make a few observations:

0) Don't invoke pack() until you've added the components.

1) Again, extend Component? I don't see a reason.

2) Again, Swing components should be constructed in the EDT; I've
implemented Runnable as another example of doing so.

3) Invoking super.paintComponent(g) is unnecessary when you paint the
entire content.

4) If you make MyAction a separate class, its constructor needs to know
who gets the selected image. Similarly, MyImage needs a method,
setImgage(), to set the new image for later painting.

5) As an example, I've added the same action to a menu bar.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyImageApp implements Runnable {

public static void main(String[] args) {
EventQueue.invokeLater(new MyImageApp());
}

@Override
public void run() {
JFrame myFrame = new JFrame();
myFrame.setTitle("Here's my Frame");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyImage core = new MyImage(myFrame);
Action myAction = new MyAction(core);
JButton myButton = new JButton(myAction);
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("File");
menu.add(new JMenuItem(myAction));
menuBar.add(menu);
myFrame.setJMenuBar(menuBar);
myFrame.add(core, BorderLayout.CENTER);
myFrame.add(myButton, BorderLayout.SOUTH);
myFrame.pack();
myFrame.setLocationRelativeTo(null);
myFrame.setVisible(true);
}
}

class MyAction extends AbstractAction {

MyImage panel;

public MyAction(MyImage panel) {
super("Open");
this.panel = panel;
}

@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
int returnVal = fileChooser.showOpenDialog(fileChooser);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
System.out.println("Image selected: " + file.getPath());
try {
BufferedImage image =
ImageIO.read(fileChooser.getSelectedFile());
panel.setImgage(image);
System.out.println("Image loaded to buffer.");
} catch (IOException ex) {
ex.printStackTrace();
}
} else {
System.out.println("File access cancelled by user.");
}
}
}

class MyImage extends JPanel {

private final Window parent;
BufferedImage image;

public MyImage(JFrame parent) {
this.parent = parent;
this.setPreferredSize(new Dimension(200, 200));
}

@Override
public void paintComponent(Graphics g) {
g.drawImage(image, 0, 0, null);
}

public void setImgage(BufferedImage image) {
this.image = image;
setPreferredSize(new Dimension(
image.getWidth(), image.getHeight()));
parent.pack();
parent.setLocationRelativeTo(null);
}
}

--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
.



Relevant Pages

  • Re: Display image selected from JFileChooser
    ... MyImage ... ImageOpenAction uses packto adjust the parent Window to ... private final Window parent; ... public void paintComponent{ ...
    (comp.lang.java.programmer)
  • Display image selected from JFileChooser
    ... MyImage ... I need to be able to access the BufferedImage returned by the ... int h = imgSrc.getHeight; ... public void paintComponent{ ...
    (comp.lang.java.programmer)
  • Re: Generic Collections and inheritance (again)
    ... public TransformedCollection(ICollectionparent, Transformer ... public void Clear ... public bool Contains ... public void Add(KeyValuePairkvp) {Parent.Add(new ...
    (microsoft.public.dotnet.languages.csharp)
  • Re: Multiple Lines with a FlowLayout within a SOUTH region in a BorderLayout
    ... Problem is, FlowLayout, if you look at the code, only calculates a preferred size which does not take into account the width of the parent container. ... public static void main ... southPanel.setLayout(new LayoutInspector()); ... public void addLayoutComponent(String name, Component comp) ...
    (comp.lang.java.gui)
  • Tree design with generics
    ... public void retrieveChildrenNodes() { ... - That the type of the parent node can be of Void type (for the ... (public FirstLevel extends Node) ... to navigate in the tree between children and parent without casting ...
    (comp.lang.java.programmer)