Reload de JFrame

10 respostas
S

Bom dia…
Estou com uma duvida sobre carregar e descarregar um jframe.

Eu tenho um Jmenu com opções de idiomas, e qua fo o usuario clicar em uma dessas opções o programa deve dar um “reload” e passar tudo, inclusive os menus para o idioma escolhido (estou usando ResourceBundle).

Imagino q nao se deva mudar idipmas desse jeito, mas eh uma coisa pra facu e o prof quer assim.

Alguem pode me dar uma ideia de como descarregar todo o jframe e carregalo novamente no idioma novo?

Obrigado…

10 Respostas

V

Feche-o e abra-o de novo.
Não existe um comando de “reload” no JFrame.

S

Desculpa a ignorancia, mas existe um comando pra fecha-lo em dar kill no programa…?

V

Sim, o método dispose(). Nada impede vc de fazer:

//Fecha esse frame
public class MeuFrame extends JFrame {
 ...

public void menuEnglishActionPerformed(ActionEvent evt) {
  this.dispose();
  new MeuFrame().setVisible(true, englishResourceBundle);
}
Caso o usuário pressione o x, certifique-se que o seu DefaultCloseOperation não seja ExIT_ON_CLOSE. Para isso, adicione ao construtor:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

Isso fará com que o evento do x tenha que ser tratado num WindowListener.

S

Ah vlw. Vou tentar dessa forma no meu codigo entao. se der certo falo aki…

F

Um NomeDoFrame.repaint(); não faz isso?

V

Não. O repaint simplesmente manda o JFrame se repintar. Essa mensagem ocorre o tempo todo, quando o JFrame é minimizado e maximizado, ou quando uma janela obscurece parte de seu conteúdo.

S

Tentei implantar o dispose.() mas não funcionou.. usei ele onde eu stou tratando a seleção de idiomas no meu.... Ta ae o código até o momento (é um modelo do livro do deitel ao qual estou editando de acordo com o que o professor pediu)

// Demonstrando menus com seleção de idiomas.
   import java.awt.Color;
   import java.awt.Font;
   import java.awt.BorderLayout;
   import java.awt.event.ActionListener;
   import java.awt.event.ActionEvent;
   import java.awt.event.ItemListener;
   import java.awt.event.ItemEvent;
   import javax.swing.JFrame;
   import javax.swing.JRadioButtonMenuItem;
   import javax.swing.JCheckBoxMenuItem;
   import javax.swing.JOptionPane;
   import javax.swing.JLabel;
   import javax.swing.SwingConstants;
   import javax.swing.ButtonGroup;
   import javax.swing.JMenu;
   import javax.swing.JMenuItem;
   import javax.swing.JMenuBar;
   import java.util.Locale;
   import java.util.ResourceBundle;
   public class MenuFrame extends JFrame
   {
      private final Color colorValues[] =
      { Color.BLACK, Color.BLUE, Color.RED, Color.GREEN };
      private JRadioButtonMenuItem colorItems[]; // itens do menu Color
      private JRadioButtonMenuItem idiomasItems[];
      private JRadioButtonMenuItem fonts[]; // itens do menu Font
      private JCheckBoxMenuItem styleItems[]; // itens do menu Font Style
      private JLabel displayJLabel; // exibe texto de exemplo
      private ButtonGroup fontButtonGroup; // gerencia itens do menu Font
      private ButtonGroup colorButtonGroup; // gerencia itens do menu Color
      private ButtonGroup idiomasButtonGroup;
      private int style; // utilizado para criar estilos de fontes
      private ResourceBundle id = null;
   // construtor sem argumento para configurar a GUI
      public MenuFrame()
      {
      	
         super( "Usando JMenus" );
         id = ResourceBundle.getBundle("ex2", new Locale("pt", "BR"));      
         JMenu fileMenu = new JMenu( id.getString("menu.arquivo") ); // cria o menu File
         
      // cria item de menu About...
         JMenuItem aboutItem = new JMenuItem( id.getString("arquivo.sobre") );
         
         fileMenu.add( aboutItem ); // adiciona o item about ao menu File
         aboutItem.addActionListener(
               new ActionListener() // classe interna anônima
               {
               // exibe um diálogo de mensagem quando o usuário seleciona About...
                  public void actionPerformed( ActionEvent event )
                  {
                     JOptionPane.showMessageDialog( MenuFrame.this,
                        id.getString("sobre.texto"),
                        id.getString("sobre.titulo"), JOptionPane.PLAIN_MESSAGE );
                  } // fim do método actionPerformed
               } // fim da classe interna anônima
            ); // fim da chamada para addActionListener
         JMenuItem exitItem = new JMenuItem( id.getString("arquivo.saida") ); // cria o item exit
         
         fileMenu.add( exitItem ); // adiciona o item exit ao menu File
         exitItem.addActionListener(
               new ActionListener() // classe interna anônima
               {
               // termina o aplicativo quando o usuário clica exitItem
                  public void actionPerformed( ActionEvent event )
                  {
                     System.exit( 0 ); // encerra o aplicativo
                  } // fim do método actionPerformed
               } // fim da classe interna anônima
            ); // fim da chamada para addActionListener
         JMenuBar bar = new JMenuBar(); // cria a barra de menus
         setJMenuBar( bar ); // adiciona uma barra de menus ao aplicativo
         bar.add( fileMenu ); // adiciona o menu File à barra de menus
         JMenu formatMenu = new JMenu( id.getString("menu.formatar") ); // cria o menu Format
         
      // array listando cores de string
         String colors[] = { id.getString("cor.preto"), id.getString("cor.azul"), id.getString("cor.vermelho"), id.getString("cor.verde") };
         JMenu colorMenu = new JMenu( id.getString("formatar.cor") ); // cria o menu Color
         
      // cria itens do menu Color com botões de opção
         colorItems = new JRadioButtonMenuItem[ colors.length ];
         colorButtonGroup = new ButtonGroup(); // gerencia cores
         ItemHandler itemHandler = new ItemHandler(); // handler para cores
      // cria itens do menu Color com botões de opção
         for ( int count = 0; count < colors.length; count++ )
         {
            colorItems[ count ] =
               new JRadioButtonMenuItem( colors[ count ] ); // cria o item
            colorMenu.add( colorItems[ count ] ); // adiciona o item ao menu Color
            colorButtonGroup.add( colorItems[ count ] ); // adiciona ao grupo
            colorItems[ count ].addActionListener( itemHandler );
         } // fim do for
         colorItems[ 0 ].setSelected( true ); // seleciona o primeiro item Color
         formatMenu.add( colorMenu ); // adiciona o menu Color ao menu Format
         formatMenu.addSeparator(); // adiciona um separador no menu
      // array listando nomes de fonte
         String fontNames[] = { id.getString("fonte.serif"), id.getString("fonte.monospaced"), id.getString("fonte.sansserif") };
         JMenu fontMenu = new JMenu( id.getString("menu.fonte") ); // cria a fonte do menu
         
      // cria itens do menu radiobutton para nomes de fonte
         fonts = new JRadioButtonMenuItem[ fontNames.length ];
         fontButtonGroup = new ButtonGroup(); // gerencia os nomes das fontes
      // criar itens do menu Font com botões de opção
         for ( int count = 0; count < fonts.length; count++ )
         {
            fonts[ count ] = new JRadioButtonMenuItem( fontNames[ count ] );
            fontMenu.add( fonts[ count ] ); // adiciona fonte ao menu Font
            fontButtonGroup.add( fonts[ count ] ); // adiciona ao grupo de botões
            fonts[ count ].addActionListener( itemHandler ); // adiciona handler
         } // fim do for
         fonts[ 0 ].setSelected( true ); // seleciona o primeiro item do menu Font
         fontMenu.addSeparator(); // adiciona uma barra separadora ao menu Font
         String styleNames[] = { id.getString("fonte.negrito"), id.getString("fonte.italico") }; // nomes dos estilos
         styleItems = new JCheckBoxMenuItem[ styleNames.length ];
         StyleHandler styleHandler = new StyleHandler(); // handler de estilo
      // criar itens do menu Style com caixas de seleção
         for ( int count = 0; count < styleNames.length; count++ )
         {
            styleItems[ count ] =
               new JCheckBoxMenuItem( styleNames[ count ] ); // para estilo
            fontMenu.add( styleItems[ count ] ); // adiciona ao menu Font
            styleItems[ count ].addItemListener( styleHandler ); // handler
         } // fim do for
         formatMenu.add( fontMenu ); // adiciona o menu Font ao menu Format
         bar.add( formatMenu ); // adiciona o menu Format à barra de menus
      // configura o rótulo para exibir texto
         displayJLabel = new JLabel( id.getString("texto"), SwingConstants.CENTER );
         displayJLabel.setForeground( colorValues[ 0 ] );
         displayJLabel.setFont( new Font( "Serif", Font.PLAIN, 72 ) );
         getContentPane().setBackground( Color.CYAN ); // configura o fundo
         add( displayJLabel, BorderLayout.CENTER ); // adiciona displayJLabel
      	
      	
      	
      	
         JMenu idiomasMenu = new JMenu( id.getString("menu.idiomas") ); // cria o menu Format
         
      // array listando idiomas de string
         String idiomas[] = { id.getString("idiomas.portugues"), id.getString("idiomas.ingles"), id.getString("idiomas.frances"), id.getString("idiomas.italiano") };
      // cria itens do menu Color com botões de opção
         idiomasItems = new JRadioButtonMenuItem[ idiomas.length ];
         idiomasButtonGroup = new ButtonGroup(); // gerencia idiomas
         //ItemHandler itemHandler = new ItemHandler(); // handler para cores
      // cria itens do menu Color com botões de opção
         for ( int count = 0; count < idiomas.length; count++ )
         {
            idiomasItems[ count ] =
               new JRadioButtonMenuItem( idiomas[ count ] ); // cria o item
            idiomasMenu.add( idiomasItems[ count ] ); // adiciona o item ao menu Color
            idiomasButtonGroup.add( idiomasItems[ count ] ); // adiciona ao grupo
            colorItems[ count ].addActionListener( itemHandler );
         } // fim do for
         idiomasItems[ 0 ].setSelected( true ); // seleciona o primeiro item Color
         bar.add( idiomasMenu ); // adiciona o menu Color ao menu Format
      	
      	
      	
      	
      	
      	
      } // fim do construtor de MenuFrame
   // classe interna para tratar eventos de ação dos itens de menu
      private class ItemHandler implements ActionListener
      {
      // processa seleções de cor e fonte
         public void actionPerformed( ActionEvent event )
         {
         // processa a seleção de cor
            for ( int count = 0; count < colorItems.length; count++ )
            {
               if ( colorItems[ count ].isSelected() )
               {
                  displayJLabel.setForeground( colorValues[ count ] );
                  break;
               } // fim do if
            } // fim do for
         	
         
         
         // processa a seleção de idioma
         	
            if (idiomasItems[0].isSelected())
            {
               id = ResourceBundle.getBundle("ex2", new Locale("pt", "BR"));
            	
            }
         	
            if (idiomasItems[1].isSelected())
            {
               id = ResourceBundle.getBundle("ex2", Locale.US);
            }
         	
            if (idiomasItems[2].isSelected())
            {
               id = ResourceBundle.getBundle("ex2", Locale.FRANCE);
            }
         	
            if (idiomasItems[3].isSelected())
            {
               id = ResourceBundle.getBundle("ex2", Locale.ITALIAN);
            }
         	
         //fim do processo de seleção de idiomas	
         	
         	
         					
         	
         // processa a seleção de fonte
            for ( int count = 0; count < fonts.length; count++ )
            {
               if ( event.getSource() == fonts[ count ] )
               {
                  displayJLabel.setFont(
                     new Font( fonts[ count ].getText(), style, 72 ) );
               } // fim do if
            } // fim do for
            repaint(); // redesenha o aplicativo
         } // fim do método actionPerformed
      } // fim da classe ItemHandler
   // classe interna para tratar eventos dos itens de menu com caixa de seleção
      private class StyleHandler implements ItemListener
      {
      // processa seleções de estilo da fonte
         public void itemStateChanged( ItemEvent e )
         {
            style = 0; // inicializa o estilo
         // verifica se negrito foi selecionado
            if ( styleItems[ 0 ].isSelected() )
               style += Font.BOLD; // adiciona negrito ao estilo
         // verifica se itálico foi selecionado
            if ( styleItems[ 1 ].isSelected() )
               style += Font.ITALIC; // adiciona itálico ao estilo
            displayJLabel.setFont(
               new Font( displayJLabel.getFont().getName(), style, 72 ) );
            repaint(); // redesenha o aplicativo
         } // fim do método itemStateChanged
      } // fim da classe StyleHandler
   } // fim da classe MenuFrame
//------------------------------------------------------------------------------------------

Aqui a simples classe para teste...

// Testando MenuFrame.
   import javax.swing.JFrame;
   public class MenuTest
   {
      public static void main( String args[] )
      {
         MenuFrame menuFrame = new MenuFrame(); // criar MenuFrame
         menuFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
         menuFrame.setSize( 800, 200 ); // configura o tamanho do frame
         menuFrame.setVisible( true ); // exibe o frame
      } // fim de main
   } // fim da classe MenuTest
//------------------------------------------------------------------------------------------

Todas a linguas funcionam quando eu seto logo no começo do construtor qual o menu deve abrir... mas ainda não consigo ao selecionar outra lingua no menu ele trocar automaticamente para o idioma novo...

Continuo solicitando ajuda...

Vlw!

V

Você terá que passar o locale desejado para o construtor. Como eu falei, o frame não irá se redesenhar do zero.

1. Altere seu construtor para receber o ResourceBundle como parâmetro:
public MenuFrame(ResourceBundle idioma)  {  
   super( "Usando JMenus" );  
   id = idioma;
   //Resto de todo aquele longo código aqui
}

//E assim fica o construtor padrão
public MenuFrame() {
    this(ResourceBundle.getBundle("ex2", new Locale("pt", "BR")));
}
2. No método que troca o idioma, feche o frame e abra-o novamente (ou seja, lá na linha 182, no lugar do repaint()):
this.dispose();
new MenuFrame(id).setVisible(true);
S

Vini tentei usar dessa forma e recebi esse erro:

MenuFrame.java:42:10:42:14: parse error at or before "JMenu"
JMenu fileMenu = new JMenu( id.getString("menu.arquivo") ); // cria o menu File
^
MenuFrame.java:42:10:42:14: parse error at or before "JMenu"
JMenu fileMenu = new JMenu( id.getString("menu.arquivo") ); // cria o menu File

O codigo no começo do construtor ficou exatamente assim:
public MenuFrame(ResourceBundle idioma)
      {
      	
         super( "Usando JMenus" );
         id = idioma      
         JMenu fileMenu = new JMenu( id.getString("menu.arquivo") ); // cria o menu File
E tentado apenas testar o dispose() eu recebo esse outro erro:
if (idiomasItems[0].isSelected())
            {
               id = ResourceBundle.getBundle("ex2", new Locale("pt", "BR"));
					this.dispose();
            	
            }
MenuFrame.java:191: cannot find symbol
symbol  : method dispose()
location: class MenuFrame.ItemHandler
					this.dispose();
					    ^
V

Estranho esse erro. O parse error geralmente ocorre quando existe um problema no código. Tem certeza que não faltou nenhum ; ou coisa parecida?

Outra coisa, não que que ali era uma inner class. Então, no lugar do this.dispose, use MenuFrame.this.dispose();

Criado 29 de abril de 2011
Ultima resposta 2 de mai. de 2011
Respostas 10
Participantes 3