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?
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 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
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.