[Resolvido]Trabalhando paineis

13 respostas
Z

Boa tarde, estou a horas tentando centralizar um painel dentro do outro e não consigo, mesmo usando BorderLayout.CENTER, o meu painel que contem uma imagem fica no canto esquerdo e eu gostaria de colocar essa imagem centralizada dentro do painel principal. Segue meu codigo.

public void criarJanela() throws IOException {
		JFrame janDoc = new JFrame();
		janDoc.setTitle("Calculadora");
		janDoc.setSize(400, 270);
		janDoc.setLocation(500, 200);
		janDoc.setVisible(true);
		janDoc.setResizable(false);

		JPanel painelPrincipal = new JPanel();
		painelPrincipal.setLayout(new BorderLayout());
		janDoc.add(painelPrincipal);
		
		JPanel painel = new JPanel();
		painel.setLayout(new GridLayout(2, 1));
		Border borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
		TitledBorder titulo = BorderFactory.createTitledBorder(borda, "Documentação");
		painel.setBorder(titulo);
		painelPrincipal.add(BorderLayout.NORTH, painel);


//Aki onde estou mexendo, coloquei o codigo inteiro para que possa ser visto melhor, e talvez identificado onde está o erro.


		BufferedImage imagem = ImageIO.read(new File("brasao1.png")); //Obtenho a imagem
		
		JPanel painelImage = new NovoPainel(imagem); //Crio um painel com a imagem
		JPanel secundImage = new JPanel(); // Um segundo painel onde vai guardar o painel da imagem
		secundImage.setLayout(new BorderLayout()); //Defino o tipo do Layout do segundo painel
		secundImage.add(BorderLayout.CENTER, painelImage); //Adiciono o painel da imagem passando ele para o centro
		painelPrincipal.add(BorderLayout.CENTER, secundImage);// Adiciono o secundPainel tambem ao centro, Mas mesmo assim a imagem vai para o lado esquerdo do painel.
		

		String x = new String("Tradutor: "); //Talves possam me ajudar nisso tambem gostaria de passar essa String aki em negrito para o JLabel, não encontrei nada util na net. Alguem pode me dar essa força?
		String x1 = new String("eclipsy - Dulce Alves");
		JLabel labelTrans = new JLabel(x + x1);
		painel.add(labelTrans);
		
	}

Se alguém puder me ajudar agraço muito.

13 Respostas

G

Se a imagem for cobrir toda a parte central do seu painelPrincipal,
Creio que você tem o método paintComponent() na classe NovoPainel… Uma solução seria usar os get Width e Height.

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

Sobre deixar a String em negrito, também é uma dúvida minha…
Desculpe se não ajudei.

Z

Geyson:
Se a imagem for cobrir toda a parte central do seu painelPrincipal,
Creio que você tem o método paintComponent() na classe NovoPainel… Uma solução seria usar os get Width e Height.

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

Sobre deixar a String em negrito, também é uma dúvida minha…
Desculpe se não ajudei.

Opa, Geyson tudo bem? Então tenho o método que coloca a imagem no painel, o que eu preciso seria por exemplo tenho um painel x e um painel y eu queria que o painel y ficasse no centro do painel x, e como o y tem a imagem então ela ficaria no centro do painel x.
Espero ter sido mais claro em minha duvida.

G

Tudo bem,
Esclarecendo uma coisa, quando você adiciona o painelImage no secundImage, não está mudando nada… pois o layout do secund é um Border e só tem o painelImage como componente dele. então ocupará todo o espaço estando no CENTER…

Portanto o painel está centrado, o que não está é a imagem, então logo, algo deve ser alterado no paintComponent();
Você pode dar uma olhada Aqui e Aqui
Porém, nesse caso você quer uma imagem de fundo no segundo painel, estou certo?

Caso contrário, era mais fácil adicionar e centralizar uma imagem ao JLabel, e depois sim, adicionar ao seu painel secundImage.

JLabel labelImage = new JLabel(); URL img = getClass().getClassLoader().getResource("Pacote/imagem.jpg"); labelImage.setIcon(new ImageIcon(img)); labelImage.setHorizontalAlignment(JLabel.CENTER);
Espero que você consiga o que deseja, vlw ae.

V

O painel “NovoPainel” se você usou o CENTER, irá ocupar TODO o centro do seu JFrame.
Para que a imagem fique no centro da tela, simplesmente altere o seu paintComponent da classe NovoPainel para que a imagem seja desenhada no centro, e não no canto.

Algo como:

int centerX = (getWidth() - fundo.getWidth()) / 2; int centerY = (getHeight() - fundo.getHeight()) / 2; g.drawImage(fundo, centerX, centerY, getWidth(), getHeight(), null);

Z

Obrigado pessoal, esse foi resolvido.
Mas e a String em negrito?
Ou a unica forma de fazer isso é criando um JLabel para cada parte da String e depois posicionar um a frente do outro?

V

É só usar html na String. Tente trocar:

String x = new String("Tradutor: "); //Talves possam me ajudar nisso tambem gostaria de passar essa String aki em negrito para o JLabel, não encontrei nada util na net. Alguem pode me dar essa força? String x1 = new String("eclipsy - Dulce Alves"); JLabel labelTrans = new JLabel(x + x1);

Por:

JLabel labelTrans = new JLabel( "&lt;html&gt;&lt;body&gt;<b>Tradutor:</b> eclipsy - Dulce Alves&lt;/body&gt;&lt;/html&gt;");

Z

ViniGodoy:
É só usar html na String. Tente trocar:

String x = new String("Tradutor: "); //Talves possam me ajudar nisso tambem gostaria de passar essa String aki em negrito para o JLabel, não encontrei nada util na net. Alguem pode me dar essa força? String x1 = new String("eclipsy - Dulce Alves"); JLabel labelTrans = new JLabel(x + x1);

Por:

JLabel labelTrans = new JLabel( "&lt;html&gt;&lt;body&gt;<b>Tradutor:</b> eclipsy - Dulce Alves&lt;/body&gt;&lt;/html&gt;");

Valeu meu amigo, muito bom mesmo.
Pode me passar um link onde posso estudar sobre esse assunto?
Posso usar isso também nos títulos dos JPanel (bordas)?
Muito obrigado pela juda.

Z

ViniGodoy:
O painel “NovoPainel” se você usou o CENTER, irá ocupar TODO o centro do seu JFrame.
Para que a imagem fique no centro da tela, simplesmente altere o seu paintComponent da classe NovoPainel para que a imagem seja desenhada no centro, e não no canto.

Algo como:

int centerX = (getWidth() - fundo.getWidth()) / 2; int centerY = (getHeight() - fundo.getHeight()) / 2; g.drawImage(fundo, centerX, centerY, getWidth(), getHeight(), null);

Não consegui entender esse codgo e ele não compila aki.

esse “fundo” é a minha imagem? Tentei colocala, mas deu erro de compilação.

G

Seu código ficou assim?

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

public class Ziru {

	public Ziru() {
		try {
			criarJanela();
		} catch (Exception e) {}
	}

	public static void main(String[] args) {
		new Ziru();
	}

	public void criarJanela() throws IOException {  
		JFrame janDoc = new JFrame();  
		janDoc.setTitle("Calculadora");  
		janDoc.setSize(400, 270);  
		janDoc.setLocation(500, 200);  
		janDoc.setVisible(true);  
		janDoc.setResizable(false);  

		JPanel painelPrincipal = new JPanel();  
		painelPrincipal.setLayout(new BorderLayout());  
		janDoc.add(painelPrincipal);  

		JPanel painel = new JPanel();  
		painel.setLayout(new GridLayout(2, 1));  
		Border borda = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);  
		TitledBorder titulo = BorderFactory.createTitledBorder(borda, "Documentação");  
		painel.setBorder(titulo);  
		painelPrincipal.add(BorderLayout.NORTH, painel);  

		//Aki onde estou mexendo, coloquei o codigo inteiro para que possa ser visto melhor, e talvez identificado onde está o erro.  

		BufferedImage imagem = ImageIO.read(new File("brasao.png")); //Obtenho a imagem  

		JPanel painelImage = new NovoPainel(imagem); //Crio um painel com a imagem  
		JPanel secundImage = new JPanel(); // Um segundo painel onde vai guardar o painel da imagem  
		secundImage.setLayout(new BorderLayout()); //Defino o tipo do Layout do segundo painel  
		secundImage.add(BorderLayout.CENTER, painelImage); //Adiciono o painel da imagem passando ele para o centro  
		painelPrincipal.add(BorderLayout.CENTER, secundImage);// Adiciono o secundPainel tambem ao centro, Mas mesmo assim a imagem vai para o lado esquerdo do painel.  

		String x = new String("Tradutor: "); //Talves possam me ajudar nisso tambem gostaria de passar essa String aki em negrito para o JLabel, não encontrei nada util na net. Alguem pode me dar essa força?  
		String x1 = new String("eclipsy - Dulce Alves");  
		JLabel labelTrans = new JLabel(x + x1);  
		painel.add(labelTrans);  
	}

	public class NovoPainel extends JPanel {

		private Image fundo;  

		public NovoPainel(Image imagem) {  
			fundo = imagem;
		} 

		@Override
		public void paintComponent(Graphics g) {  
			super.paintComponent(g);  
			int centerX = (getWidth() - fundo.getWidth(null)) / 2;  
			int centerY = (getHeight() - fundo.getHeight(null)) / 2;  
			g.drawImage(fundo, centerX, centerY, null);
		}  
	}
}

V

Sim cara, fundo é sua imagem. Conforme você mesmo postou em seu código, da classe NovoPainel. Foi você quem escreveu essa classe?

Você pode ler sobre isso aqui:
http://docs.oracle.com/javase/tutorial/uiswing/components/label.html

Aliás, para qualquer componente do Swing, basta digitar no google “How to nomedocomponente” que ele acha um tutorial desses. (Eu digitei How to JLabel).

Sobre Java2D e manipulação de imagens, você pode seguir esse roadmap:
http://www.guj.com.br/java/244860-roadmap-processamento-de-imagens>

Z

Boa tarde a todos, agradeço pela ajuda.
Desculpe minha ignorancia ViniGodoy, é que nos metodos getHeight() e getWidth(), estava a me pedir parametros e não soube qual adicionar.
Valeu pelo exemplo do codgo funcionando Geyson.

@Override public void paintComponent(Graphics g) { super.paintComponent(g); int centerX = (getWidth() - fundo.getWidth(null)) / 2; //aki int centerY = (getHeight() - fundo.getHeight(null)) / 2;// e aki g.drawImage(fundo, centerX, centerY, null);

Z

Como marco o topico como resolvido?

V
  1. Vá no seu primeiro post;
  2. Clique em Editar;
  3. Escreva [Resolvido] na frente do Assunto;
  4. Clique em Enviar.
Criado 7 de outubro de 2012
Ultima resposta 8 de out. de 2012
Respostas 13
Participantes 3