Redimensionar automaticamente o JFrame de acordo com o monitor do usuario

E ai pessoal blz aew ?

Bom, eu fiz um programa la em casa, no meu pc … e o monitor é 17’’ … ai depois vim aqui no trampo … e o monitor é 15’’ … e o programa ficou mto grande … alguem tem alguma ideia de como fazer redimensionar automaticamente a janela de acordo com o monitor que estou usando ?

vlw ae

  1. Não utilize o NullLayout. Use o GridBagLayout.
  2. Deixe o usuário escolher o tamanho da janela.

Se precisar fazer no braço, você sempre pode recorrer ao:

Para obter o objeto do tipo DisplayMode, que descreve a resolução usada por seu usuário.

[quote=ViniGodoy]1. Não utilize o NullLayout. Use o GridBagLayout.
2. Deixe o usuário escolher o tamanho da janela.

Se precisar fazer no braço, você sempre pode recorrer ao:

Para obter o objeto do tipo DisplayMode, que descreve a resolução usada por seu usuário.[/quote]

e ai Vinigodoy blz ae ?
entao cara, eu nao to usando null layout … pq é o seguinte: tenho duas classes para a janela principal: Janela e DesignJanela … a classe Janela mostra os jmenu’s e permite que a janela principal seja exibida, e a DesignJanela retorna os botoes, abas, para a classe Janela, sendo exibidos … e é nessa classe (DesignJanela) que eu fiz o gridbaglayout …
enfim, pelo que eu entendi, esse codigo que vc me passou pega a resoluçao do monitor do usuario ? é isso ? mas e depois ? como faço ? help ae

Quando eu preciso fazer uma tela que deve rodar em resoluções diferentes eu uso o netbeans, habilitando o redimensionamento vertical e horizontal da janela… No começo foi meio chato, mas com o tempo vc pega o jeito.

Seguinda a idéia do ViniGodoy, você pode setar o tamanho de cada componente da GUI como uma função da resolução da tela. Aí na criação da janela, você faz os cálculos… Acho que fica um pouco mais trabalhoso que fazer com o netbeans mas o resultado pode ser melhor e além disso, se você fizer um negócio organizado e bem planejado, pode usar isso pra qualquer tela…

Até.

Se vc tem a resolução, tem o tamanho da tela do usuário… Aí vc usa o setSize da sua janela, aplicando a proporção que vc quiser…

De cada componente não. Só da janela. O Gridbaglayout se encarrega do resto.
Isso não é exclusividade só do Netbeans, mas um recurso do Java.

O mesmo vale para as propriedades horizontal e vertical. Lembre-se: O netbeans é apenas uma IDE, ou seja, um editor de textos inteligente, próprio para o Java. A linguagem mesmo não muda, então os recursos disponíveis também não.

hagar, vlw pela sugestao … mas estou programando no eclipse, e nao curto mto o netbeans … ai é um problema :slight_smile:
e mais: vc nao tem algum exemplo de como fazer de acordo com a ideia do ViniGodoy ? alguem poderia me dar um exemplo sobre como fazer isso ?

vlw

eu usei o seguinte comando:

ou seja, pra maximizar o tamanho da janela … no monitor de 17, tranquilo, ja no de 15 :cry:

Mas aí vc está maximizando a janela!!!

Usa no state normal e só define um tamanho para a janela, como praticamente qualquer aplicação faz.

[quote=ViniGodoy]Mas aí vc está maximizando a janela!!!

Usa no state normal e só define um tamanho para a janela, como praticamente qualquer aplicação faz.[/quote]

humm … fiz o seguinte

ate que funciona … mas qdo a janela abre, ela fica minimizada o maximo possivel … como faço pra deixar num tamanho correto ? so usar o setSize ? afinalm setState pra que serve ?

É só usar o setSize.

O setState e o setExtendedState servem para maximizar ou minimizar a janela. Normal é o estado padrão, você não precisa usar o comando nesse caso.

[quote=ViniGodoy]É só usar o setSize.

O setState e o setExtendedState servem para maximizar ou minimizar a janela. Normal é o estado padrão, você não precisa usar o comando nesse caso.[/quote]

blz … vlw ^^

so que infelizmente surgiu outro problema … os componentes do jframe (abas, panels, botoes) nao acompanham o tamanho da janela … ou seja, se eu diminuir a janela, os componentes continuarao a mesma coisa… ai complicou mesmo aieuhaeuiha … eu sei que tem que usar o gridbaglayout … mas como eu disse: eu usei o gridbaglayout … tenho duas classes para a janela principal, Janela e DesignJanela … a classe Janela mostra os jmenu’s e permite que a janela principal seja exibida, e a DesignJanela retorna os botoes, abas, panels, para a classe Janela, sendo exibidos la… e é na classe DesignJanela que eu fiz o gridbaglayout …
é por isso que nao to entendendo pq os componentes nao acompanham o tamanho da janela …

Para isso é preciso usar corretamente o GridBagLayout:

Algumas dicas (nas GridBagConstraints):

  1. Defina a propriedade peso (weight) corretamente para os componentes que irão se esticar;
  2. Defina corretamente as âncoras dos componentes, especialmente os que não esticam, para saber para onde eles se deslocarão;
  3. Ajuste as margens dos componentes (eu geralmente ponho todas em 3);

Além disso, em cada componente, verifique se a propriedade PreferredSize está correta e que você não está limitando o maximumSize.

So pra vcs terem uma noçao …
Ai está a classe Janela …

[code]
public class Janela extends JFrame {

static JProgressBar progressBar;
private String img = "./Imagens/Apple-logo.jpg";
BotaoProc c = new BotaoProc();
PanelImagem panimg;
JLabel p = new JLabel();
ImageIcon icon;
DesignJanela dj = new DesignJanela(img);
public static String pathFile;

public Janela() {
	
	setTitle("Aplicação Exemplo");
	
	JMenu arquivo = new JMenu("Arquivo");
	JMenuItem novo = new JMenuItem("Novo  'n'");
	
	JMenuItem abrir = new JMenuItem("Abrir  'a'");

	JMenu salvar = new JMenu("Salvar  's'");
	
	JMenuItem salvarIm = new JMenuItem("Imagem");

	JMenuItem salvarArq = new JMenuItem("Arquivo");
	
	salvar.add(salvarIm);
	salvar.add(salvarArq);
	
	JMenuItem logoff = new JMenuItem("Logoff  'l'");

	JMenuItem sair = new JMenuItem("Sair");

	        JMenu ajuda = new JMenu("Help");
	JMenuItem sobre = new JMenuItem("Sobre  'o'");

	ajuda.add(sobre);

	arquivo.add(novo);
	arquivo.add(abrir);
	arquivo.add(salvar);
	arquivo.addSeparator();
	arquivo.add(logoff);
	arquivo.addSeparator();
	arquivo.add(sair);

	JMenuBar menu = new JMenuBar();
	setJMenuBar(menu);
	menu.add(arquivo);
	menu.add(ajuda);
    
    try {
    	UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.updateComponentTreeUI(this);
    }
    catch (Exception e) {
        System.out.println("Erro de Interface");
    }
    
    this.add(dj);
 	setLocationRelativeTo(null);
 	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 	setSize(600, 600);
}

public void visivel() {
	this.setVisible(true);
}

}[/code]

E agora a classe DesignJanela

[code]
public class DesignJanela extends JPanel {

Informacoes c1 = new Informacoes();
Observacoes c2 = new Observacoes();
PanelImagem p = new PanelImagem();
BotaoProc c = new BotaoProc();

private ImageIcon icon = new ImageIcon();
private JLabel labImg = new JLabel();
private ImageIcon imagem;
private JLabel l;
private String cop;

public DesignJanela(final String img) {
	cop = img;
			
	JPanel painelCentral = new JPanel(new BorderLayout());    // painel central -> container de todos os outros paineis   
        JPanel painelInferior = new JPanel(new FlowLayout());     // painel central -> container dos dois paineis inferiores   

      //painelCentral.add(menu,BorderLayout.NORTH);   // adicionando a barra de menus

      // Painel Imagem
      TitledBorder tituloImagem;   // titulo do painel
      tituloImagem = BorderFactory.createTitledBorder("Imagem"); // cria borda com titulo
    
    JTabbedPane tabs = new JTabbedPane();

    icon = new ImageIcon(cop);
    l = new JLabel(icon);
    l.setBounds(4, 4, 800, 800);
    labImg.add(l);
    labImg.setPreferredSize(new Dimension(800, 800));
    
    JPanel painelImagem = new JPanel();
    painelImagem.setPreferredSize(new Dimension(200, 200));
    painelImagem.setBorder(tituloImagem);
    painelImagem.add(labImg);
    
    painelCentral.add(painelImagem,BorderLayout.CENTER);
    
    //Painel Inferior - Que ira conter os outros dois
    painelCentral.add(painelInferior,BorderLayout.SOUTH);
    
    TitledBorder tituloBot;
    tituloBot = BorderFactory.createTitledBorder("Processamento de Imagens");
    
    JPanel painelBotao = new JPanel();
    painelBotao.setPreferredSize(new Dimension(250, 200));
    painelBotao.setBorder(tituloBot);
    painelBotao.add(c.getLayout());
    
    painelInferior.add(painelBotao);
    // Painel Informacoes
    TitledBorder tituloInf;
    tituloInf = BorderFactory.createTitledBorder("Informações");

    JPanel painelInformacoes = new JPanel();
    painelInformacoes.setPreferredSize(new Dimension(300, 200));
    painelInformacoes.setBorder(tituloInf);
    painelInformacoes.add(c1.getLayout());
    
    painelInferior.add(painelInformacoes);

    // Painel Observações
    //TitledBorder tituloObs;
    //tituloObs = BorderFactory.createTitledBorder("Observações");

    JPanel painelObservacoes = new JPanel();
    //painelObservacoes.setPreferredSize(new Dimension(300, 200));
    //painelObservacoes.setBorder(tituloObs);
    painelObservacoes.add(c2.getLayout());

    //painelInferior.add(painelObservacoes);
    
    tabs.addTab("Aba 1", painelCentral);

    tabs.addTab("Relatório", painelObservacoes);
    
    this.add(tabs);
}

public void setImagem(String s) {
	imagem = new ImageIcon(s);
	imagem = p.ajustaTam(imagem);
	l.setIcon(imagem);
	l.setLocation(5, 5);
	l.repaint();
	cop = s;
}

}[/code]

vejam ae … :wink:

De cada componente não. Só da janela. O Gridbaglayout se encarrega do resto.
Isso não é exclusividade só do Netbeans, mas um recurso do Java.

O mesmo vale para as propriedades horizontal e vertical. Lembre-se: O netbeans é apenas uma IDE, ou seja, um editor de textos inteligente, próprio para o Java. A linguagem mesmo não muda, então os recursos disponíveis também não.[/quote]

Eu só disse que quando preciso fazer esse tipo de aplicação faço com o NetBeans porque considero mais fácil, e não que esse é um recurso exclusivo do netbeans. Se o que escrevi sugeriu isso, me desculpem…

E o gridbaglayout se encarrega de redimensionar os componentes sim, mas se precisar fazer sem gerenciador de layout, tem que fazer componente por componente…

No caso do GidBagLayout, o editor do Visual Editor do Eclipse é uma mão na roda também.

Mas eu concordo com vc Hagar… no geral, é melhor deixar o trabalho braçal para IDE mesmo. :slight_smile: