Centralizar JInternalFrame apos mecher no tamanho do JFrame

ola pessoal, seguinte…
tenho um JFrame com um JDesktopPane dentro.
Neste JDesktopPane são abertos os JInternalFrames.
o JFrame abre maximizado, e os JInternalFrames abrem centralizados no JDesktopPane ou JFrame(como preferirem)

o que eu quero:
quando o usuario restaurar o JFrame, e diminuir seu tamanho
o JinternalFrame que estiver aberto volte a ser centralizado.
se o usuario “pegar” com o mouse a borda do JFrame e mecher no seu tamanho, tb centralizar o jinternalframe.

alguem ae faz ideia de como fazer isso?
credito que sea um evento disparado quando alterar o tamanho do JFrame, algo do tipo!
Grato :smiley:

Oi,

Poderia explicar melhor? Ficou muito confuso esse JFrame no JDesktopPane etc…

Tchauzin!

Pense em um JFrame com um JDesktopPane dentro.
quando abre o JFrame ele eh maximizado, e o JDesktopPane tb pq esta colado nele.
ae abro um JInternalFrame centralizado dentro deste JDesktopPane.
ate ae tudo bem, porem quando modifico o tamanho do JFrame (logo o JDesktopPane tb eh alterado)
o JInternalFrame fica parado no mesmo lugar.
quero que quando eu mecha no tamanha do JDesktopPane, o JInternalFrame se centralize novamente.

entendeu?

Oi,

Sim.

  • Crie um listener para pegar o novo tamanho do JDesktopPane, e jogue o JInternalFrame para o novo ponto central.

Tchauzin!

pois é, o problema eh que centralizei o JInternalFrame com a propriedade do netBeans.
entao isso q vc falou eh grago pra mim.
mas valeu, vou dar mais uma pesquisada em relação a isso que voce falou.

Boa tarde a todos.

Olha, a única maneira de você conseguir fazer isto, não é só implementando um Listener de Evento, mas também reescrevendo o método Paint do JInternalFrame desta forma:

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JInternalFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DesktopFrame extends JInternalFrame {
    private static final long serialVersionUID = 1L;
    
    public DesktopFrame(String title){
        super(title, true, true, true, true);
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setPreferredSize(new Dimension(300, 200));
            pack();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        Dimension dim = this.getParent().getSize();
        int x = (int)(dim.getWidth() - this.getSize().getWidth()) / 2; 
        int y = (int)(dim.getHeight() - this.getSize().getHeight()) / 2; 
        this.setLocation(x,y); 
    }

Vale lembrar que o objeto this.getParent() retorna o container do JInternalFrame, que neste caso é o JDesktopPane, portanto o seu JInternalFrame tem que está contindo nele.

Outra sugestão é que você faça desta classe que apresentei, um JInternalFrame genérico, e os demais JInternalFrame estenda (Herda) desta JInternalFrame genérico para que você não fique reescrevendo o método Paint a toda hora.

Coloque este código abaixo, também dentro do seu JFrame principal.

     ...
    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
    ....

Pois ele apresenta um visual de uma GUI muito agradável.

Um detalhe, que este método Paint reescrito, todos os JInternalFrames serão centralizados, até na abertura dos mesmos, e isto engessa a localização dos mesmos no centro, até se você tentar arrastá-los para outra posição, eles retornarão para o centro, e você não conseguirá colocá-los em outra posição.

Um abraço.

Bom dia a todos.

Pensando melhor existe também a implementação com um listener de eventos chamado ComponentListener, é na verdade é bem melhor do que você reescrever o método paint. Isto se deve ao fato, que com o ComponentListener, você não engessa o JInternalFrame totalmente no centro do JDesktopPane, permitindo assim que você o arraste para outro canto, e ele só retornará para o centro do formulário quando for redimensionado, vamos ao código:


import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import javax.swing.JInternalFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DesktopFrame extends JInternalFrame implements ComponentListener {
    private static final long serialVersionUID = 1L;
    
    public DesktopFrame(String title){
        super(title, true, true, true, true);
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setPreferredSize(new Dimension(300, 200));
            addComponentListener(this);
            pack();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        }
    }
    
    // Método para centralizar o JInternalFrame na tela
    public void setLocationToCenter(JInternalFrame frame){
        Dimension dim = frame.getParent().getSize();
        int x = (int)(dim.getWidth() - frame.getSize().getWidth()) / 2; 
        int y = (int)(dim.getHeight() - frame.getSize().getHeight()) / 2; 
        frame.setLocation(x,y); 
    }

    @Override
    public void componentResized(ComponentEvent e) {
        // Este método é disparado quando o JInternalFrame é redimensionado
        setLocationToCenter(this);
    }
    
    
    @Override
    public void componentMoved(ComponentEvent e) {
       // Aqui é disparado quando o componente é movido 
    }

    @Override
    public void componentShown(ComponentEvent e) {
       // Aqui é disparado quando ele é mostrado
    }

    @Override
    public void componentHidden(ComponentEvent e) {
        // E aqui é disparado quando ele é escondido
    }

}

Um abraço.