Redimensionar automaticamente o JFrame de acordo com o monitor do usuario
15 respostas
J
JamesBond
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 ?
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.
J
JamesBond
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.
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
H
Hagar
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é.
V
ViniGodoy
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…
V
ViniGodoy
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.
J
JamesBond
hagar, vlw pela sugestao … mas estou programando no eclipse, e nao curto mto o netbeans … ai é um problema
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
J
JamesBond
eu usei o seguinte comando:
ou seja, pra maximizar o tamanho da janela … no monitor de 17, tranquilo, ja no de 15
V
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.
J
JamesBond
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.
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 ?
V
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.
J
JamesBond
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.
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 …
V
ViniGodoy
Para isso é preciso usar corretamente o GridBagLayout:
Algumas dicas (nas GridBagConstraints):
Defina a propriedade peso (weight) corretamente para os componentes que irão se esticar;
Defina corretamente as âncoras dos componentes, especialmente os que não esticam, para saber para onde eles se deslocarão;
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.
J
JamesBond
So pra vcs terem uma noçao ..
Ai está a classe Janela ...
publicclassJanelaextendsJFrame{staticJProgressBarprogressBar;privateStringimg="./Imagens/Apple-logo.jpg";BotaoProcc=newBotaoProc();PanelImagempanimg;JLabelp=newJLabel();ImageIconicon;DesignJaneladj=newDesignJanela(img);publicstaticStringpathFile;publicJanela(){setTitle("Aplicação Exemplo");JMenuarquivo=newJMenu("Arquivo");JMenuItemnovo=newJMenuItem("Novo 'n'");JMenuItemabrir=newJMenuItem("Abrir 'a'");JMenusalvar=newJMenu("Salvar 's'");JMenuItemsalvarIm=newJMenuItem("Imagem");JMenuItemsalvarArq=newJMenuItem("Arquivo");salvar.add(salvarIm);salvar.add(salvarArq);JMenuItemlogoff=newJMenuItem("Logoff 'l'");JMenuItemsair=newJMenuItem("Sair");JMenuajuda=newJMenu("Help");JMenuItemsobre=newJMenuItem("Sobre 'o'");ajuda.add(sobre);arquivo.add(novo);arquivo.add(abrir);arquivo.add(salvar);arquivo.addSeparator();arquivo.add(logoff);arquivo.addSeparator();arquivo.add(sair);JMenuBarmenu=newJMenuBar();setJMenuBar(menu);menu.add(arquivo);menu.add(ajuda);try{UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());SwingUtilities.updateComponentTreeUI(this);}catch(Exceptione){System.out.println("Erro de Interface");}this.add(dj);setLocationRelativeTo(null);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setSize(600,600);}publicvoidvisivel(){this.setVisible(true);}}
E agora a classe DesignJanela
publicclassDesignJanelaextendsJPanel{Informacoesc1=newInformacoes();Observacoesc2=newObservacoes();PanelImagemp=newPanelImagem();BotaoProcc=newBotaoProc();privateImageIconicon=newImageIcon();privateJLabellabImg=newJLabel();privateImageIconimagem;privateJLabell;privateStringcop;publicDesignJanela(finalStringimg){cop=img;JPanelpainelCentral=newJPanel(newBorderLayout());// painel central -> container de todos os outros paineis JPanelpainelInferior=newJPanel(newFlowLayout());// painel central -> container dos dois paineis inferiores //painelCentral.add(menu,BorderLayout.NORTH); // adicionando a barra de menus// Painel ImagemTitledBordertituloImagem;// titulo do paineltituloImagem=BorderFactory.createTitledBorder("Imagem");// cria borda com tituloJTabbedPanetabs=newJTabbedPane();icon=newImageIcon(cop);l=newJLabel(icon);l.setBounds(4,4,800,800);labImg.add(l);labImg.setPreferredSize(newDimension(800,800));JPanelpainelImagem=newJPanel();painelImagem.setPreferredSize(newDimension(200,200));painelImagem.setBorder(tituloImagem);painelImagem.add(labImg);painelCentral.add(painelImagem,BorderLayout.CENTER);//Painel Inferior - Que ira conter os outros doispainelCentral.add(painelInferior,BorderLayout.SOUTH);TitledBordertituloBot;tituloBot=BorderFactory.createTitledBorder("Processamento de Imagens");JPanelpainelBotao=newJPanel();painelBotao.setPreferredSize(newDimension(250,200));painelBotao.setBorder(tituloBot);painelBotao.add(c.getLayout());painelInferior.add(painelBotao);// Painel InformacoesTitledBordertituloInf;tituloInf=BorderFactory.createTitledBorder("Informações");JPanelpainelInformacoes=newJPanel();painelInformacoes.setPreferredSize(newDimension(300,200));painelInformacoes.setBorder(tituloInf);painelInformacoes.add(c1.getLayout());painelInferior.add(painelInformacoes);// Painel Observações//TitledBorder tituloObs;//tituloObs = BorderFactory.createTitledBorder("Observações");JPanelpainelObservacoes=newJPanel();//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);}publicvoidsetImagem(Strings){imagem=newImageIcon(s);imagem=p.ajustaTam(imagem);l.setIcon(imagem);l.setLocation(5,5);l.repaint();cop=s;}}
vejam ae .. :wink:
H
Hagar
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.
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…
V
ViniGodoy
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.