[Resolvido]Trabalhando paineis

13 respostas
Ziru

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

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.

Ziru

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.

Geyson

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.

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);

Ziru

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?

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;");

Ziru

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.

Ziru

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.

Geyson

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);
		}  
	}
}

ViniGodoy

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>

Ziru

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);

Ziru

Como marco o topico como resolvido?

ViniGodoy
  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