Adicionando JPanel com imagem em um JFrame em tempo de execução

4 respostas
H

Srs.,

Já tentei tudo que pude imaginar e algumas tentativas de alguns tópicos do fórum mas não adianta, então peço a ajuda de vocês.

Abaixo segue a classe JPanel que exibe a imagem:

public class ImagePanel extends JPanel {

	private Image img;

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

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

A classe JFrame:

public class ImagemJFrame extends JFrame {

	private Container container;

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

	public ImagemJFrame() {
		super();
		container = getContentPane();
		container.setLayout(null);
		criarBotoes();
		init();
		initComponents();
	}

	public void init() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(400, 400);
		setLocation(200, 200);
	}

	public void initComponents() {
		Container box = Box.createHorizontalBox();
		box.add(jbIniciar);
		box.add(Box.createHorizontalStrut(30));
		box.add(jbUm);
		box.add(Box.createHorizontalStrut(10));
		box.add(new JButton("Dois"));
		box.add(Box.createHorizontalStrut(10));
		box.add(new JButton("Três"));
		box.setBounds(10, 10, ((int) getSize().getWidth()) - 20, 20);
		container.add(box);

		JLabel label = new JLabel("Texto");
		label.setBounds(10, 40, 50, 20);
		container.add(label);

		/* Colocando aqui funciona!!!
		 * 
		 * JPanel panelImagens = getPanel();
		panelImagens.setBounds(10, 60, 255, 100);
		container.add(panelImagens);*/
	}

	public JPanel getPanel() {
		Toolkit toolkit = Toolkit.getDefaultToolkit();

		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(1, 3));

		Image image = toolkit.getImage("imagem.jpg");

		panel.add(new ImagePanel(image));
		image = toolkit.getImage("imagem.jpg");
		panel.add(new ImagePanel(image));
		image = toolkit.getImage("imagem.jpg");
		panel.add(new ImagePanel(image));

		return panel;
	}

	public void criarBotoes() {
		jbIniciar = new JButton("Iniciar");
		jbIniciar.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
			}
		});

		jbUm = new JButton("Um");
		jbUm.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				JPanel panelImagens = getPanel();
				panelImagens.setBounds(10, 60, 255, 100);
				container.add(panelImagens);
			}
		});
	}

	private JButton jbIniciar;

	private JButton jbUm;
}

O objeto é clicar no botão “Um” e exibir um JPanel que conterá três JPanels do tipo ImagePanel.

Problema: Quando clico no botão “Um” o código no ActionListener é executado mas o JPanel não é exibido porém quando maximizo a tela o mesmo é renderizado, portanto minha pergunta é: O que faço para renderizar a tela, ou JPanel para as imagens sejam exibidas sem redimensionar a tela?

Obrigado.

4 Respostas

rocha

Já tentou o método repaint() do JPanel?

H

Sim Rocha, já tentei o repaint do JPanel principal e do container mas continua do mesmo jeito.

Grato.

H

Pessoal,

Consegui resolver o problema usando o repaint() porém precisei fazer algumas alterações além de invocar este método.

1º Alteração => A classe ImagePanel ficou assim:

public class ImagePanel extends JPanel {

	private Image img;

	public ImagePanel(Image img) {
		this.img = img;
	}

	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(img, 0, 0, this);
	}
}

Removi as atribuições de tamanho do construtor pois não havia necessidade. O ponto mais importante nessa classe foi colocar o this no 4º parâmetro do g.drawImage.

2º Alteração => No código anterior eu usava um JPanel para conter os ImagePanel e depois adicionava no Container. Agora modifiquei para incluir diretamente no Container os ImagePanel.

Resolveu.

Obrigado.

Marky.Vasconcelos

O quarto parâmetro do Graphics.drawImage é o ImageObserver, quando o observer ve que a imagem foi desenhada(draw) ela “diz” a classe se re-renderizar

JPanel já implementa ImageObserver por isso o this

Criado 18 de outubro de 2007
Ultima resposta 18 de out. de 2007
Respostas 4
Participantes 3