Centralizar JInternalFrame

Boa tarde pessoal …

Como eu faço para centralizar um JInternalFrame na tela???

Eu tentei setLocationRelativeTo(null); mas não deu certo(aliás, o JInternalFrame nem tem esse método) …

Tem como, derrepente capturar a resolução da tela e depois tentar setar um getLocation no JInternalFrame???(foi a única forma que eu pensei se não tiver nada pronto) …

Vlw pessoal …

Vc não precisa pegar a resolução, e sim o tamanho do JDesktopPane, pois o seu JInternalFrame vai ser centralizado usando o JDesktopPane como referência não é?

[code]
int lDesk = seuDeskPane.getWidth();
int aDesk = seuDeskPane.getHeight();
int lIFrame = seuIFrame.getWidth();
int aIFrame = seuIFrame.getHeight();

seuIFrame.setLocation( lDesk / 2 - lIFrame / 2, aDesk / 2 - aIFrame / 2 );[/code]

Até mais!

2 curtidas

Eu implementei a dica do davidbuzatto da seguinte forma:

[code]
// centraliza no o jifArqMunicipes no JDesktopPane
centraliza(jifArqMunicipes);

public static void centraliza(JInternalFrame janela){
	// centraliza no JDesktopPane
	int lDesk = dtpPrincipal.getWidth();  
	int aDesk = dtpPrincipal.getHeight();  
	int lIFrame = janela.getWidth();  
	int aIFrame = janela.getHeight();  

	janela.setLocation(lDesk / 2 - lIFrame / 2, aDesk / 2 - aIFrame / 2);
}[/code]

Porém, só está funcionando depois que eu clico no Menu pela 2ª vez, o que pode estar acontecendo?
Da primeira vez ele simplismente não fica no centro, aparece inclusive com parte fora do meu JDesktopPane …

Muito obrigado !!!

Vc adiciona o frame no desktop antes de centralizá-lo?

Sim … Ele já está pré-adicionado quando eu crio o JDesktopPane, mas com o setVisible(false);
Eu já crio todos os JInternalFrames no momento que eu crio o JDesktopPane e seto os defaults tipo desabilitar os botões de maximizar, negar redimensionamento manual do jit, etc…
Estou chamando o método para centralizar nesse trecho

[code]
// Opção Usuarios do Menu Arquivo
jmiArqUsuarios.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{

			// chama o cadastro de usuários
			ArqUsuarios cadastroUsuarios = new ArqUsuarios();
			jifArqUsuarios.add(cadastroUsuarios.jpnPrincipal);
			add(dtpPrincipal);
			//jifArqUsuarios.setBounds(335, 190, 390, 180);
			jifArqUsuarios.setSize(400, 180);
			jifArqUsuarios.setVisible(true);
			
			// centraliza no o jifArqUsuarios no JDesktopPane
			centraliza(jifArqUsuarios);
		}
	});[/code]

Engraçado que, quando eu clico pela 2ª vez no menu, ele vem centralizado, depois disso, qualquer menu que eu abra vem centralizado, muito estranho porque ele sempre executa os mesmos códigos, tanto da primeira quanto da segunda vez que eu clico no menu !!! … Muito estranho

jcmaster, coloque o método centraliza antes!Quando a primeira JInternalFrame for executada, não vai dar para centralizar pq ela já terá sido jogada(exibida) na tela!

Pois é, eu fiz isso, antes de dar um setVisible(true) no meu JInternalFrame, eu chamei o método para cenntralizar, mas, ele só centraliza se eu clicar duas vezes no menu, muuuuito mistico !!! rsrs

private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {
int lDesk = JDPPrincipal.getWidth();
int aDesk = JDPPrincipal.getHeight();
int lIFrame = JIFAtribuirTarefa.getWidth();
int aIFrame = JIFAtribuirTarefa.getHeight();
JIFAtribuirTarefa.setLocation(lDesk / 2 - lIFrame / 2, aDesk / 2 - aIFrame / 2);
}
voce coloca na ação do menu que da cero

Eu uso esses codigo pra centralizar, redimensionar e colocar em cascata, coloco o metodo Organizar janela em um evento do desktopPane pra qdo for adicionado ou removido orgainar.

public static void cascade(JDesktopPane desktopPane) {
        JInternalFrame[] frames = desktopPane.getAllFrames();
        if (frames.length == 0) {
            return;
        }
        cascade(frames, desktopPane.getBounds(), 5);
    }

    private static void cascade(JInternalFrame[] frames, Rectangle dBounds, int separation) {
        int i = 0;
        for (JInternalFrame f : frames) {
            //Redimensiona pra 2/3 do tamanho do jdesktopPane
            int w = (dBounds.width / 4) * 3;
            int h = (dBounds.height / 4) * 3;
            int mid = (dBounds.width - w) / 2;
            f.setBounds(
                    (separation + dBounds.x + i * separation) + mid,
                    separation + dBounds.y + i * separation,
                    w, //f.getBounds().width,
                    h); //f.getBounds().height);
            i++;
        }
    }

private void organizarJanela() {
        try {
            if (desktopPane.getAllFrames().length > 0) {
                cascade(desktopPane);
                //Depois de organizado e redimensionado seleciona o ultimo frame adicionado
                desktopPane.getAllFrames()[desktopPane.getAllFrames().length - 1].setSelected(true);
            }
        } catch (PropertyVetoException ex) {
            Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:

Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:

    //ADICIONA TELAS (JInternalFrame) AO JDesktopPane
    // usado assim: this.addTelaDesk(new TelaFuncionarios(null));
    public void addTelaDesk(JInternalFrame tela){
        for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
            // se uma janela semelhante estiver aberta
            if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
                jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
                
                Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
                int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
                                                "Janela duplicada",
                                                JOptionPane.DEFAULT_OPTION,
                                                JOptionPane.QUESTION_MESSAGE,
                                                null,
                                                opções,
                                                opções[0]
                                        );
                // se utilizar a aberta retorna e não abre outra,
                // caso contrário sai do for e abre outra igual
                if(qst == 0){
                    return;
                }else if(qst == 1){
                    break;
                }
            }
        }

        this.telaDesktop.add(tela); //adiciona na tela
        tela.setVisible(true); // seta visivel
        this.cascade(); //coloca em cascata para deixar "pratico"
    }

A função para colocar em cascata:

    private void cascade() {
        JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
        Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
        int separation = 25; // distancia entre as janelas

        // Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
        int i = desk.getAllFrames().length; // quantidade de frames
        for (JInternalFrame f : desk.getAllFrames()) {
            f.setLocation(i*separation, i*separation);
            i--; //mutiplicador
        }
    }  

Exemplos de como chamar depois:


this.addTelaDesk(new TelaFuncionarios(null));

String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));

Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!

Abraços

Precisava ressuscitar 3 tópicos antigos para dizer isso?

tentei fazer o q foi colocado aqui

int lDesk = seuDeskPane.getWidth();   
int aDesk = seuDeskPane.getHeight();   
int lIFrame = seuIFrame.getWidth();   
int aIFrame = seuIFrame.getHeight();   
  
seuIFrame.setLocation( lDesk / 2 - lIFrame / 2, aDesk / 2 - aIFrame / 2 );  

porem quando coloco
meuInternalFrame.getWidth
ou
meuInternalFrame.getHeight

ele da erro na linha =/

o erro

non-static method getWidth cannot be referenced from a static context

alguem sabe o q pode ser isso?

Poste seu código.

O erro diz que você tentou chamar um método não estático de dentro de um método estático. Não tem nada a ver com o JInternalFrame em si.

resolvi, vo posta o codigo caso alguem tenha interesse!
o que eu queria era centralizar no jdesktoppane todos os jinternalframes abertos.
segua o codigo (colocado no metodo contrutor da classe ontem esta o jdesktopane)

//disparando evento quando tamanho do desktopPane for modificado
        jDesktopPane1.addComponentListener(new ComponentAdapter() {   
            @Override
            public void componentResized(ComponentEvent e) {   
                //aqui vai o que quero que aconteça quando mecher no tamanho do jdesktoppane
                //pega todos os jinternalframes existentes no jdesktoppane
                JInternalFrame[] iframes = jDesktopPane1.getAllFrames(); 
                //percorrendo todos os jinternalframes pegos
                for ( JInternalFrame iframe: iframes ) {
                    //se jinternalframe estiver aberto, vai ser centralizado
                   if ( iframe.isVisible() ){
                       //centralizando jinternalframe
                       
                       int lDesk = jDesktopPane1.getWidth();     
                        int aDesk = jDesktopPane1.getHeight();     
                        int lIFrame = iframe.getWidth();     
                        int aIFrame = iframe.getHeight();     

                        iframe.setLocation( lDesk / 2 - lIFrame / 2, aDesk / 2 - aIFrame / 2 );   
                  }  
               }  
          }   
      });

[quote=rcipriani]Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:

Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:

    //ADICIONA TELAS (JInternalFrame) AO JDesktopPane
    // usado assim: this.addTelaDesk(new TelaFuncionarios(null));
    public void addTelaDesk(JInternalFrame tela){
        for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
            // se uma janela semelhante estiver aberta
            if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
                jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
                
                Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
                int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
                                                "Janela duplicada",
                                                JOptionPane.DEFAULT_OPTION,
                                                JOptionPane.QUESTION_MESSAGE,
                                                null,
                                                opções,
                                                opções[0]
                                        );
                // se utilizar a aberta retorna e não abre outra,
                // caso contrário sai do for e abre outra igual
                if(qst == 0){
                    return;
                }else if(qst == 1){
                    break;
                }
            }
        }

        this.telaDesktop.add(tela); //adiciona na tela
        tela.setVisible(true); // seta visivel
        this.cascade(); //coloca em cascata para deixar "pratico"
    }

A função para colocar em cascata:

    private void cascade() {
        JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
        Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
        int separation = 25; // distancia entre as janelas

        // Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
        int i = desk.getAllFrames().length; // quantidade de frames
        for (JInternalFrame f : desk.getAllFrames()) {
            f.setLocation(i*separation, i*separation);
            i--; //mutiplicador
        }
    }  

Exemplos de como chamar depois:


this.addTelaDesk(new TelaFuncionarios(null));

String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));

Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!

Abraços

[/quote]
Excelente exemplo amigo, corrigi alguns problemas relacionado a ordem de exibição das janelas, segue o código melhorado…
No método addTelaDesk…

public void addTelaDesk(JInternalFrame tela) {
	for (JInternalFrame antiga : getDesktop().getAllFrames()) {
		if (antiga.getClass().toString()
				.equalsIgnoreCase(tela.getClass().toString())) {				
			antiga.moveToFront();
			// fix caso usuário escolha a janela que já está aberta,
			// ou feche a dialog o focus ficará na janela duplicada que está
			// em focus atrás da dialog 
			try {
				antiga.setSelected(true);
			} catch (PropertyVetoException e) {
				e.printStackTrace();
			}
			Object[] opcoes = { "Utilizar aberta", "Abrir nova" };
			int qst = JOptionPane
					.showOptionDialog(
							janela,
							"Abrir uma nova janela ou utilizar a que já está aberta?",
							"Ops! Janela duplicada", 
							JOptionPane.DEFAULT_OPTION,
							JOptionPane.QUESTION_MESSAGE,
							null, 
							opcoes,
							opcoes[0]);
			if (qst <= 0) {
				//fix caso o usuário feche o dialog sem escolher uma opção
				return;
			} else if (qst == 1) {
				break;
			}
		}
	}
	getDesktop().add(tela);
	tela.setVisible(true);
	this.cascade();
}

No método cascade…

private void cascade() {  
	int separation = 25;
	int i = getDesktop().getAllFrames().length;
	for (JInternalFrame f : getDesktop().getAllFrames()) {  
		f.setLocation(i*separation, i*separation);  
		i--;
		if (i == 0) {
			//dá o focus sempre na última janela que ficará em cascata
			try {
				f.setSelected(true);
			} catch (PropertyVetoException e) {
				e.printStackTrace();
			}
		}
	}  
}