ViniGodoy:
Sobrescreva o método getPreferredSize() do seu painel para retornar o tamanho da imagem também.
Ou use uma implementação já pronta, como esta:
https://github.com/MarkyVasconcelos/Towel/blob/master/src/com/towel/swing/img/JImagePanel.java
ViniGodoy, aproveitando a dúvida do colega eu criei mais duas classes baseadas inclusive em um artigo seu.
[url]http://pontov.com.br/site/java/48-java2d/111-trabalhando-com-imagens[/url]
Realmente as barras de rolagem do scrollPane não aparecem!!!
Eis a pergunta, esse comportamento é normal no scrollPane? Ou falta algum ajuste nestes códigos??? Os conteines (JPanel e outros) não podem ser setados no ViewportView, o scrollPane simplesmente ignora a presença do conteiner JPanel e não ativa as barras de rolagem???? Para esse tipo de aplicação é mais indicado o uso do Jlabel juntamente com o ImageIcon???
Abaixo as outras duas classes que comprovam essa afirmação.
Desde já, obrigado pela resposta.
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;
public class TestandoCarregamentoDeImagens2 extends JFrame {
public static void main(String[] args) throws HeadlessException, IOException {
new TestandoCarregamentoDeImagens2().setVisible(true);
}
private JScrollPane scrollPane = new JScrollPane();
private JButton botao = new JButton("Coloca imagem.");
private JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
public TestandoCarregamentoDeImagens2() throws HeadlessException {
configure();
}
private void clicaBotao(ActionEvent evt) throws IOException {
int c = chooser.showOpenDialog(null);
if (c == JFileChooser.APPROVE_OPTION) {
scrollPane.setViewportView(new PainelCarregaImagem(chooser.getSelectedFile().getAbsolutePath()));
}
}
private void configure() {
chooser.setFileFilter(filter);
botao.setCursor(new Cursor(Cursor.HAND_CURSOR));
this.getContentPane().add(botao, BorderLayout.NORTH);
this.getContentPane().add(scrollPane, BorderLayout.CENTER);
this.setDefaultCloseOperation(3);
this.setSize(400, 400);
this.setLocation(200, 100);
botao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
clicaBotao(evt);
} catch (IOException ex) {
Logger.getLogger(TestandoCarregamentoDeImagens2.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}
Classe utilizada acima...
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;
public class PainelCarregaImagem extends JPanel {
private Image imagem;
public PainelCarregaImagem(String path) {
this.imagem = Toolkit.getDefaultToolkit().createImage(path);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
g.drawImage(imagem, 0, 0, this);
}
}
Outra classe que demonstra esse contexto...
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.filechooser.FileNameExtensionFilter;
public class TestandoCarregamentoDeImagens3 extends JFrame {
public static void main(String[] args) throws HeadlessException, IOException {
new TestandoCarregamentoDeImagens3().setVisible(true);
}
private JScrollPane scrollPane = new JScrollPane();
private JButton botao = new JButton("Coloca imagem.");
private JFileChooser chooser = new JFileChooser();
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
public TestandoCarregamentoDeImagens3() throws HeadlessException {
configure();
}
private void clicaBotao(ActionEvent evt) throws IOException {
int c = chooser.showOpenDialog(null);
if (c == JFileChooser.APPROVE_OPTION) {
BufferedImage image = ImageIO.read(new File(chooser.getSelectedFile().getAbsolutePath()));
scrollPane.setViewportView(new PainelCarregaImagem2(image));
}
}
private void configure() {
chooser.setFileFilter(filter);
botao.setCursor(new Cursor(Cursor.HAND_CURSOR));
this.getContentPane().add(botao, BorderLayout.NORTH);
this.getContentPane().add(scrollPane, BorderLayout.CENTER);
this.setDefaultCloseOperation(3);
this.setSize(400, 400);
this.setLocation(200, 100);
botao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
clicaBotao(evt);
} catch (IOException ex) {
Logger.getLogger(TestandoCarregamentoDeImagens3.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
}
}
Classe utilizada acima...
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;
public class PainelCarregaImagem2 extends JPanel {
private BufferedImage imagem;
public PainelCarregaImagem2(BufferedImage imagem) {
this.imagem = imagem;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(imagem, 0, 0, imagem.getWidth(), imagem.getHeight(), this);
g2d.dispose();
}
}