Mudar idioma de aplicação Swing

11 respostas
J

Olá,

Gostaria de saber se existe um jeito fácil de alterar o idioma de uma aplicação Swing. Por exemplo, quando chamo um JOptionPane, aparece “Sim” e “Não” ao invés de “Yes” e “No”. No JFileChooser, já aparece “Abrir” e “Cancelar” ao invés de “Open” e “Cancel”…

Pensei em usar um Locale pt-br, mas não sei onde :slight_smile:

Agradeço se puderem ajudar.

11 Respostas

V

Já tentou o método estático setDefault da classe Locale?

Antes disso, você terá que ver se o locale em questão está disponível. No caso, existe o método getDefaultLocale(), também estático, na mesma classe.

A

Ai um exemplo.

import javax.swing.*;
public class JOptionConfirm2 
 {

   public static void main(String[] args)
   {
	 int saida;
	 String opcoes[] = {"Opcao[1]","Opcao[2]","Opcao[3]","Opcao[4]","SAIR"}; //vetor de opções, botões. 
	 while(true)
	 {
	  saida = JOptionPane.showOptionDialog(null, "ESCOLHA UMA OPCÃO\nRESULTADO NO CONSOLE", "Teste do Metodo =&gt JOptionPane.showOptionDialog", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, opcoes, null);
      switch(saida)
	   {
       case 0:
    	System.out.println("OPCÃO 1 FUNCIONANDO!!");
        break;
       case 1:
    	System.out.println("OPCÃO 2 FUNCIONANDO!!");
        break;
       case 2:
    	System.out.println("OPCÃO 3 FUNCIONANDO!!");
        break;
       case 3:
    	System.out.println("OPÇÃO 4 FUNCIONANDO!!");
        break;
       case 4:
    	System.exit(0);
        break;
	   } 	
	}
  }
}

JFileChooser

import java.io.*;
import javax.swing.*;


//Como alterar o texto dos botões Open e Save de um JFileChooser 

public class TextoBotoes{
  public static void main(String[] args) {
    JFileChooser fc = new JFileChooser();
    
    // Altera o texto do botão Open ou Save
    fc.setApproveButtonText("Abrir");
    
    // Define a tecla de atalho
    fc.setApproveButtonMnemonic('a');
    
    // Define o tool tip
    fc.setApproveButtonToolTipText("Clique  para abrir o arquivo selecionado");
    
    int r = fc.showOpenDialog(new JFrame());
    
    System.exit(0);
  }
}
J

Parece que o setDefault do Locale não funcionou:

public static void main(String args[]) {
        Locale.setDefault(new Locale("pt","BR"));
    	java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TesteFrmPrincipal(new Usuario()).setVisible(true);
            }
        });
    }

O que está acima deve estar errado… como associar o Locale ao meu Frame?

Alguma idéia?

F

Ja pensou em usar a classe locale

J

Err… sim, mas não funcionou.

Mas parece que o método do arm.jr deu certo, apesar de resolver apenas o problema do JOptionPane. Só que em uma aplicação desktop geralmente também temos JFileChoosers, JColorChoosers, etc… Pensei que existia alguma forma de setar o idioma sem ter que configurar cada componente da aplicação no braço :slight_smile:

R

Bem amigo, qto aos botões é como o colega já explicou que nós fazemos aqui. Vc mencionou que tem mais Dialogs como FileChooser, etc, que também precisam ser traduzidos. Bem, abaixo está o método que uso pra traduzir meus FileChooser. Se vc descobrir como traduzir os demais que possui nos mande por favor. Eu acho até que deve ser parecido com o que estou te passando.

Eu apenas chamo este método quando inicio meu sistema.

public void traduzirFileChooser(){
		
	UIManager.put("FileChooser.lookInLabelMnemonic", "E");  
  	UIManager.put("FileChooser.lookInLabelText", "Examinar em");
	  	
  	UIManager.put("FileChooser.saveInLabelMnemonic", "S");
  	UIManager.put("FileChooser.saveInLabelText", "Salvar em");
	  	
  	UIManager.put("FileChooser.upFolderToolTipText", "Um nível acima");
  	UIManager.put("FileChooser.upFolderAccessibleName", "Um nível acima"); 
	  	
  	UIManager.put("FileChooser.homeFolderToolTipText", "Desktop");
  	UIManager.put("FileChooser.homeFolderAccessibleName", "Desktop"); 

  	UIManager.put("FileChooser.newFolderToolTipText", "Criar nova pasta");
  	UIManager.put("FileChooser.newFolderAccessibleName", "Criar nova pasta"); 
	  	
  	UIManager.put("FileChooser.listViewButtonToolTipText", "Lista"); 
  	UIManager.put("FileChooser.listViewButtonAccessibleName", "Lista"); 
	  	
  	UIManager.put("FileChooser.detailsViewButtonToolTipText", "Detalhes"); 
  	UIManager.put("FileChooser.detailsViewButtonAccessibleName", "Detalhes"); 

  	UIManager.put("FileChooser.fileNameLabelMnemonic", "N");
  	UIManager.put("FileChooser.fileNameLabelText", "Nome do arquivo"); 
	  	
  	UIManager.put("FileChooser.filesOfTypeLabelMnemonic", "A");
  	UIManager.put("FileChooser.filesOfTypeLabelText", "Arquivos do tipo"); 

  	UIManager.put("FileChooser.fileNameHeaderText", "Nome");
  	UIManager.put("FileChooser.fileSizeHeaderText", "Tamanho");
  	UIManager.put("FileChooser.fileTypeHeaderText", "Tipo");
  	UIManager.put("FileChooser.fileDateHeaderText", "Data");
  	UIManager.put("FileChooser.fileAttrHeaderText", "Atributos");
	  	
  	UIManager.put("FileChooser.cancelButtonText", "Cancelar");
  	UIManager.put("FileChooser.cancelButtonMnemonic", "C");
  	UIManager.put("FileChooser.cancelButtonToolTipText", "Cancelar");
	  	
  	UIManager.put("FileChooser.openButtonText", "Abrir");
  	UIManager.put("FileChooser.openButtonMnemonic", "A");
  	UIManager.put("FileChooser.openButtonToolTipText", "Abrir");
	  	
  	UIManager.put("FileChooser.saveButtonText","Salvar");
  	UIManager.put("FileChooser.saveButtonToolTipText", "S");
  	UIManager.put("FileChooser.saveButtonToolTipText", "Salvar");
	  	
  	UIManager.put("FileChooser.updateButtonText","Alterar");
  	UIManager.put("FileChooser.updateButtonToolTipText", "A");
  	UIManager.put("FileChooser.updateButtonToolTipText", "Alterar");
	  	
  	UIManager.put("FileChooser.helpButtonText","Ajuda");
  	UIManager.put("FileChooser.helpButtonToolTipText", "A");
  	UIManager.put("FileChooser.helpButtonToolTipText", "Ajuda");
	  	
  	UIManager.put("FileChooser.acceptAllFileFilterText","Todos os arquivos");
}

[]'s :wink:

J

Uia… não sabia desse UIManager… vou tentar, valeu.

J

Dê uma olhada:

public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
           	javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
            	Frm1 f = new Frm1();
                f.traduzirFileChooser();
                f.setVisible(true);
            }
        });
    }

E dentro do Frm1 (que estende JFrame), eu instancio um JFileChooser. Não funcionou :frowning:

Será que é alguma configuração do Eclipse, ou algo a mais que esqueci de setar?

R

Bom, veja só como eu faço:

public class MinhaClasse {

	JFrame frame;
    
	public static void main(String[] args) {
    	
    	        MinhaClasse minhaClasse = new MinhaClasse();
    	
    	        // Traduzir FileChooser
    	        MyFileChooser fc = new MyFileChooser();
    	        fc.traduzirFileChooser();
    	        fc = null;
    	        //

    	        // Tela de abertura
                iniciarTelaPrincipal(minhaClasse);
    	        //
	}

	private static void iniciarTelaPrincipal(MinhaClasse minhaClasse){
	        final TelaPrincipal telaPrincipal = new TelaPrincipal();
    	        minhaClasse.frame = telaPrincipal;
                java.awt.EventQueue.invokeLater(new Runnable() {
                        public void run() {
            	                telaPrincipal.setVisible(true);
                        }
                });

                telaPrincipal.addWindowListener(new WindowAdapter(){
        	        public void windowActivated(WindowEvent e){
        		        SwingUtilities.invokeLater(new Runnable(){
        			        public void run(){
        				        telaPrincipal.repaint();
        			        }
        		        });
                	}
                });
	}

}

Onde MyFileChooser é minha classe que possui o método de tradução e MinhaClasse é a classe principal do sistema que chama a TelaPrincipal (menu do sistema). Perceba que primeiro eu faço a chamada do método de tradução e só depois eu instancio a primeira tela do sistema.

Boa sorte! :wink:

J

Era isso mesmo renata, eu estava chamando depois de instanciar… :stuck_out_tongue:

Quanto aos JOptionPanes, fiz uma classe que estende a JOptionPane, e deu certo também. Veja:

public class JOptionPaneBR extends JOptionPane {

	private static int SIM_NAO = 0;
	private static int SIM_NAO_CANCELAR = 1;
	
	private static String[] yesNoOptions = 
{"Sim","Não"};
	private static String[] yesNoCancelOptions = {"Sim","Não","Cancelar"};
	
	public static int showConfirmDialog(Component parentComponent,
        Object message, String title, int optionType)
	{
		if( optionType == 0 )
			return showOptionDialog(parentComponent,
					message, title, YES_NO_OPTION, QUESTION_MESSAGE,
					null, JOptionPaneBR.yesNoOptions, null);
		else
			return showOptionDialog(parentComponent,
			        message, title, YES_NO_CANCEL_OPTION, QUESTION_MESSAGE,
			        null, JOptionPaneBR.yesNoCancelOptions, null);
	}
}

Muito obrigado pela sua ajuda.

L

Funciona tanto para o confirme como para os outros, eu acho…

Você tem que alterar a Key do componente… trocando por uma nova:

UIManager.put("OptionPane.yesButtonText", "Sim"); UIManager.put("OptionPane.noButtonText", "Não"); JOptionPane.showConfirmDialog(null, "Confirma?", "opa",JOptionPane.YES_NO_OPTION);

Fazendo isso em seu construtor, vai servir para todas as janelas de mensagem…

Tchauzin!

Criado 12 de abril de 2007
Ultima resposta 17 de abr. de 2007
Respostas 11
Participantes 6