Coordenadas do JFrame

No JFrame, a origem é o canto superior esquerdo, com x e y aumentando para a direita e para baixo, respectivamente.

Eu gostaria de settar a origem do JFrame no centro da janela.

Dicas?

[quote=tomorrowdoesntmakesense]No JFrame, a origem é o canto superior esquerdo, com x e y aumentando para a direita e para baixo, respectivamente.

Eu gostaria de settar a origem do JFrame no centro da janela.

Dicas?[/quote]

O que tá usando como ide? isso facilitaria muito pra vc.

pode tentar pegar o seu frame (f) e fazer isso:
f.setBounds(posicao_x, posicao_y, largura_x, largura_y);

[quote=Luiz Augusto Prado]O que tá usando como ide? isso facilitaria muito pra vc.

pode tentar pegar o seu frame (f) e fazer isso:
f.setBounds(posicao_x, posicao_y, largura_x, largura_y);
[/quote]

Normalmente uso Eclipse ou Gedit.

Sobre o setBounds, não é exatamente o que quero. Este método serve pra eu settar a posição e o tamanho da janela, mas o que eu quero é alterar as coordenadas internas do JFrame.

Vou citar um exemplo…

import javax.swing.*;
public class Exemplo extends JFrame {
	JButton button = new JButton("Botão");
	public Exemplo() {
		super("Apenas 01 exemplo");
		setSize(640, 480);
		setResizable(true);
		setLayout(null);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
		button.setBounds(0, 0, 80, 30);
		add(button);
	}
}

Esta classe cria uma janela com um botão. Este botão tem 80 pixels de comprimento e 30 de altura e está no ponto (0, 0) da janela.
Como você deve imaginar, ao abrir esta janela, você verá o botão no canto superior esquerdo dela, pois a origem -ou seja, o ponto (0, 0)- é o canto superior esquerdo.

Minha dúvida é: como fazer para a origem do JFrame não ser o canto superior esquerdo, mas sim o exato centro dela mesma?

[quote=tomorrowdoesntmakesense][quote=Luiz Augusto Prado]O que tá usando como ide? isso facilitaria muito pra vc.

pode tentar pegar o seu frame (f) e fazer isso:
f.setBounds(posicao_x, posicao_y, largura_x, largura_y);
[/quote]

Normalmente uso Eclipse ou Gedit.

Sobre o setBounds, não é exatamente o que quero. Este método serve pra eu settar a posição e o tamanho da janela, mas o que eu quero é alterar as coordenadas internas do JFrame.

Vou citar um exemplo…

import javax.swing.*;
public class Exemplo extends JFrame {
	JButton button = new JButton("Botão");
	public Exemplo() {
		super("Apenas 01 exemplo");
		setSize(640, 480);
		setResizable(true);
		setLayout(null);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		
		button.setBounds(0, 0, 80, 30);
		add(button);
	}
}

Esta classe cria uma janela com um botão. Este botão tem 80 pixels de comprimento e 30 de altura e está no ponto (0, 0) da janela.
Como você deve imaginar, ao abrir esta janela, você verá o botão no canto superior esquerdo dela, pois a origem -ou seja, o ponto (0, 0)- é o canto superior esquerdo.

Minha dúvida é: como fazer para a origem do JFrame não ser o canto superior esquerdo, mas sim o exato centro dela mesma?[/quote]

bom, acho que to entendendo o que tá querendo.
vc pode fazer o seguinte… Adiconar um JPanel em um JFrame configurado com layout null (sugestao de ide para trabalhar com swing é o netbeans que lhe permite fazer isso arrastando componentes de uma palleta):
getContentPane().setLayout(null);

Eu marquei o JPanel com uma borda. só pra vc poder visualiza-lo.
Dai em diante, passe a adicionar os componentes dentro deste JPanel. Desta forma vai ter a impressão que quer dar.

public class NewApplication extends javax.swing.JFrame {

    /** Creates new form NewApplication */
    public NewApplication() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">
        private void initComponents() {

                jPanel1 = new javax.swing.JPanel();

                setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
                getContentPane().setLayout(null);

                jPanel1.setBorder(javax.swing.BorderFactory.createEtchedBorder()); // só pra vc poder visualizar o JPanel

                javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
                jPanel1.setLayout(jPanel1Layout);
                jPanel1Layout.setHorizontalGroup(
                        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGap(0, 96, Short.MAX_VALUE)
                );
                jPanel1Layout.setVerticalGroup(
                        jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGap(0, 96, Short.MAX_VALUE)
                );

                getContentPane().add(jPanel1);
                jPanel1.setBounds(130, 100, 100, 100);

                pack();
        }// </editor-fold>

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewApplication().setVisible(true);
            }
        });
    }

        // Variables declaration - do not modify
        private javax.swing.JPanel jPanel1;
        // End of variables declaration

}

Infelizmente, não há uma forma trivial de se fazer isso usando o Swing, só usando o Java 2D. Você terá que fazer a transformação linear manualmente.

Felizmente, isso é fácil: Some metade da altura e metade da largura da janela sempre que for fornecer uma coordenada.

Caso você queira considerar o centro da janela desprezando as bordas, você deverá levar em conta os insets da janela após abri-la. Nesse caso, eu recomendaria criar 2 funções:

public int centerX(int x) {
     int internalWidth = getWidth() - getInsets().left - getInsets.right;
     return x + getInsets().right + internalWidth / 2;
}

public int centerY(int y) {
    int internalHeight = getHeight() - getInsets().bottom - getInsets.top;
    return y + getInsets().top + getHeight() / 2;
}

Agora, no caso de você estar fazendo uma interface gráfica, com botões, menus, etc. Recomendo FORTEMENTE que você não utilize coordenadas diretamente, e sim, os gerenciadores de layout. Usar layout null, como comentado anteriormente, vai te levar a uma aplicação onde será impossível redimensionar janelas (a menos que você faça muito cálculo) e onde o comportamento multiplataforma ficará seriamente comprometido.

Se estiver usando Java 2D para desenhar na tela, é possível ajustar a transformação das coordenadas com os seguintes comandos:
@Override

[code]public void paint(Graphics g) {
//Criamos um contexto gráfico que não leva em conta as bordas
Graphics2D g2d = (Graphics2D) g.create(getInsets().right,
getInsets().top,
getWidth() - getInsets().left,
getHeight() - getInsets().bottom);

//Aplicamos a transformação de coordenadas
int internalWidth = getWidth() - getInsets().left - getInsets.right;
int internalHeight = getHeight() - getInsets().bottom - getInsets.top;
g2d.setTransform(
    AffineTransform.getTranslateInstance(internalWidth / 2.0, internalHeight / 2.0));

//Desenhe aqui usando o g2d, que terá suas coordenadas referentes ao centro da tela.

g2d.dispose();

}[/code]

Colegas, obrigado pelas dicas! Eu estava utilizando o meio indicado pelo Vini: calcular as médias de altura e largura da janela pra então acertar o centro dela, mas eu achei que fosse gambiarra e houvesse uma maneira elegante (e simples) de se fazer isso :wink: Mas tudo bem, não é um problema.

Vini, sobre LayoutManager, confesso que costumo não utilizá-los para aplicações de qualquer tipo, pois minhas experiências com gerenciadores de layout foram muito, muito ruins. Eu gosto da liberdade de ajustar exatamente a posição de cada componente da minha tela. Me foi um um trabalho árduo fazer com que o LayoutManager organize a tela do jeito que eu idealizava.
Mas vou começar a usá-los daqui pra frente, já que esta parece ser uma boa prática…

Luiz, eu não uso o NetBeans justamente porque quero fazer tudo por código, nada de clicar e arrastar hehe.

Agradeço a ajuda de ambos. Valeu.

@edit
Eu realmente estava desenhando na tela quando resolvi criar este tópico :smiley:

Dê uma olhada no MigLayout. Ele é um LayoutManager fácil de usar e bastante poderoso:
http://www.miglayout.com/

Com layout managers a posição dos componentes realmente não fica 100% perfeita. Mas a idéia deixa-los relativos par que possam se ajustar a mudanças no tamanho da tela, a alterações na tipologia das fontes (que ocorrem quando você troca de plataforma), mudanças de resolução, etc.