[ HELP ] Centralizar um gráfico na tela

Pessoa estou com um problema pra centralizar um gráfico. Estou utilizando um container e nele eu adiciono alguns botoes ao sul e ao norte. No entanto, quando vou adicionar no centro, parece que buga e o gráfico n fica centralizado, mas sim no canto da pagina. O código é o seguinte:
//construtor
public Main() {

	setExtendedState(JFrame.MAXIMIZED_BOTH);
	setTitle("Arvore Geradora Minima com Pesos nos Vertices Internos");
	setLocationRelativeTo(null);
	setLayout(new BorderLayout());
	
	menuPrincipal = new JMenuBar();
	texto = new JTextArea();
	dlg = new JFileChooser();
	
	mArquivo = new JMenu("Arquivo");
	abrir = new JMenuItem("Abrir");
	salvar = new JMenuItem("Salvar");
	novo = new JMenuItem("Novo");
	//crio o container
            container = getContentPane();
	
	menuPrincipal.add(mArquivo);
	mArquivo.add(novo);
	mArquivo.add(abrir);
	mArquivo.add(salvar);
	
	abrir.addActionListener(this);
	salvar.addActionListener(this);
	novo.addActionListener(this);
	
             //adiciono alguns botoes ao norte
	container.add(BorderLayout.NORTH, menuPrincipal);
	
	pBotoes = new JPanel();
	
	b_grafoInicial = new JButton("Grafo Inicial");
	b_arvMin = new JButton("Árvore Mínima");
	b_cancelar = new JButton("Sair");
	b_heuristica = new JButton("Heurística");
	
	b_arvMin.addActionListener(this);
	b_cancelar.addActionListener(this);
	b_grafoInicial.addActionListener(this);
	b_heuristica.addActionListener(this);
	
	pBotoes.add(b_grafoInicial);
	pBotoes.add(b_arvMin);
	pBotoes.add(b_heuristica);
	pBotoes.add(b_cancelar);

             //adiciono alguns botoes ao sul
	container.add(BorderLayout.SOUTH, pBotoes);
	
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	setVisible(true);
	
}

 //parte do código que da problema
  if (click.getSource() == abrir){
   
        int retorno = dlg.showOpenDialog(texto);
         
        if (retorno == JFileChooser.APPROVE_OPTION){
            
            File arquivo = dlg.getSelectedFile();
            G = new ArquivoGrafo().criaGrafo(arquivo.toString());
            grafico = new Grafico(G);
              //aqui está o problema, quando adiciono o gráfico ja preenchido, eu queria q ele ficasse bem no centro da tela, mas isso n acontece
            container.add(BorderLayout.CENTER, grafico);
            validate();
        }
    }

//a seguir vai uma imagem para vcs verem para onde o grafo está indo

É que sua classe Grafico só desenha o grafo no canto esquerdo.
Se foi você quem implementou essa classe, sugiro que calcule o retângulo correspondente à bounding box de seu grafo e aí, ao desenhar, ajuste um offset em X e Y para desenhar de forma centralizada.

1 curtida

Ah então tá explicado, tentei de tudo e nunca que essa merda ia pro centro. E sim foi eu que implementei a classe Gráfico. Sua sugestão é então setar as coordenadas do grafo manualmente certo?

Sim, se quiser, posta o código dessa classe.

Mas basicamente você tem que fazer o seguinte:

Obter um Rectangle correspondente à bounding box do grafo.

Onde no retângulo abaixo:

a--------b
|        |
|        |
|        |
d--------c

a.x = ponto x do vértice mais à esquerda
a.y = ponto y do vértice mais em cima

b.x = ponto x do vértice mais à direita
b.y = ponto y do vértice mais em cima

c.x = ponto x do vértice mais à direita
c.y = ponto y do vértice mais em baixo

d.x = ponto x do vértice mais à esquerda
d.y = ponto y do vértice mais em baixo

Aí você usa esse retângulo para obter o offset em x e em y para centralizar o desenho.

offset.x = (largura da área de desenho - largura do retângulo) / 2
offset.y = (altura da área de desenho - altura do retângulo) / 2

Depois é só somar o offset às coordenadas dos vértices ao desenhar o grafo.

1 curtida

Funcionou certinho mano, vlw o/