[Dúvida] Curiosidade, tamanho do componente

7 respostas
ArchV

(Criei este tópico porque este problema já aconteceu comigo outras vezes, no entando desprezei e realizei um “pseudo-POG”, no entanto não quero enfrenta-lo de novo da mesma forma) Estou implementando o “jogo da velha”, analisando matemáticamente eu pensei, vou criar um JFrame 300x300pixels sendo que o jogo da velha tem 3 linhas por 3 colunas, então se eu repartir o jframe com duas linhas a cada 100 pixels de distância, vai ficar no tamanho exato. Repare no paintComponent, as linhas são colocadas a 100 px de distância, começando do 0 e termina no 300 tamanho da tela, até aqui pensei, legal vai dar certinho. Executei o programa e olha uma screen shot do resultado:


Sim, saiu fora de simetria, alguém já passou por este problema, estou fazendo algo errado, devo considerar uma porcentagem no calculo da área, qual o procedimento certo?
vlw.

public class JogoDaVelha extends JFrame
{
    private Painel painel;
    public JogoDaVelha()
    {
        super("Jogo da Velha!");
        setSize(300,300);
        setResizable(false);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocation(400,300);

        painel = new Painel();
        getContentPane().add(painel);

        setVisible(true);
      }
}


// classe Painel.
public class Painel extends JPanel
{
   public Painel()
   {
     setSize(300,300);
     setBackground(Color.BLACK);
   }
   @Override
   public void paintComponent(Graphics g)
   {
       super.paintComponent(g);
       g.setColor(Color.yellow);
       g.drawLine(100, 0, 100, 300);
       g.drawLine(200, 0, 200, 300);
       g.drawLine(0, 100, 300, 100);
       g.drawLine(0, 200, 300, 200);
   }
}

7 Respostas

M

Se você quer que cada uma das 3 áreas tenha 100x100 pixels, então sua janela deve ter 300+largura ocupada por duas linhas pixels (e não somente 300), uma vez que as linhas também consomem espaço.

ArchV

hmm, ok, mas antes de eu ir buscar qual é o tamanho de cada linha em pixel (acredito que seja 1pixel de largura). Tenho uma pergunta:

Mas, repare que o alinhamento vertical ficou mais “comprimido” em relação ao comprimento horizontal, se somente as linhas afetam o tamanho do componente, qual seria a explicação para esse “comprimido” vertical?

Instalei o Photoshop, abri essa imagem que eu fiz o upload, recortei extamente a área que contém o background preto e surprendentemente as medidas foram:

Width:296 Heigth:274

Então, toda vez que eu precisar fazer um calculo preciso de área tenho que descontar 4 pixels da largura e 26 pixels da altura? Acreditava convictamente que a área do background era de 300x300 pixels.

(Estou debatendo isso apenas por curiosidade para futuros projetos)

M

Correção: além do tamanho das linhas há também o tamanho da decoração da janela. Por isso é altamente recomendável fazer a renderização em um JPanel (que não tem esse problema) e adicionar o JPanel ao JFrame.

O

Opa, como o colega aí de cima falou, acredito que o interessante neste caso seria definir o tamanho do painel (300x300pixels) e ajustar o formulario automaticamente conforme o tamanho do painel.

Você poderia fazer assim:

  1. Definir o tamanho do painel:
...
public Painel()   
{   
  setPreferredSize(new Dimension(300,300));   
  setBackground(Color.BLACK);   
}
...
  1. E então ajustar o tamanho do formulario de acordo com o tamanho do painel usando-se o metodo pack(), por exemplo:
...        
painel = new Painel();   
getContentPane().add(painel);   
pack();
...

Espero ter ajudado.

ArchV

ono.leo:
Opa, como o colega aí de cima falou, acredito que o interessante neste caso seria definir o tamanho do painel (300x300pixels) e ajustar o formulario automaticamente conforme o tamanho do painel.

Você poderia fazer assim:

  1. Definir o tamanho do painel:
...
public Painel()   
{   
  setPreferredSize(new Dimension(300,300));   
  setBackground(Color.BLACK);   
}
...
  1. E então ajustar o tamanho do formulario de acordo com o tamanho do painel usando-se o metodo pack(), por exemplo:
...        
painel = new Painel();   
getContentPane().add(painel);   
pack();
...

Espero ter ajudado.

Quando estava implementando acreditei convitamente que, se eu tenho uma JFrame 300x300 px e adiciono um componente e não declaro o seu tamanho consequemente esse irá ser do tamanho do JFrame (300x300) no caso (sem utilizar algum layoutManager).

O

Opa, você pode fazer um pequeno experimento como a do codigo abaixo:

import javax.swing.JButton;
import javax.swing.JFrame;

public class Formulario {
	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setSize(300, 300);
		f.setLocationRelativeTo(null);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JButton botao = new JButton("botao");
		f.add(botao);
		f.setVisible(true);
		
		// exibe o tamanho do botao
		System.out.println("width=" + botao.getSize().width + "/height=" + botao.getSize().height);
	}
}

Apesar do formulario de 300x300pixels, o tamanho do botão exibido na saída será: "width=292/height=273" por causa da barra de título da janela e das bordas. O problema é que o tamanho dessas bordas pode variar de acordo com o estilo, configuração, SO que estiver utilizando.

Bom, espero ter ajudado.

M

ArchV:

Quando estava implementando acreditei convitamente que, se eu tenho uma JFrame 300x300 px e adiciono um componente e não declaro o seu tamanho consequemente esse irá ser do tamanho do JFrame (300x300) no caso (sem utilizar algum layoutManager).

Pois é, acontece que o tamanho do JFrame não é exclusivo para o que há dentro dele, como já foi dito: há também a decoração da janela. E não verdade você está usando, sim, um gerenciador de leiaute, você só não o definiu explicitamente. O BorderLayout é usado nesse caso por ser o gerenciador padrão para o JFrame.

Criado 30 de janeiro de 2010
Ultima resposta 2 de fev. de 2010
Respostas 7
Participantes 3