Esse artigo faz parte da revista Java Magazine edição 61. Clique aqui para ler todos os artigos desta edição

ZE: 10pt; BACKGROUND: white; COLOR: red; FONT-FAMILY: Verdana; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">

COLOR: windowtext; FONT-FAMILY: Verdana">I de Preferences do Java com toda sua simplicidade e robustez.

 

Para que serve:

A API de Preferences provê uma forma extremamente simples, porém eficaz, de armazenar preferências do usuário e/ou sistema.

 

Em que situação o tema é útil:

Salvar preferências é uma funcionalidade presente em grande parte das aplicações que utilizamos no dia a dia. Portanto, esse deve ser um ponto a ser considerado na hora de desenvolver uma aplicação, principalmente quando se trata de uma aplicação desktop.

 

Java Preferences API:

Nos dias de hoje, armazenar as preferências, explícitas e implícitas, do usuário é uma característica essencial em aplicações desktop. Isto pode ser feito de diversas maneiras. Podemos implementar uma solução completa, de forma ad hoc, sem reaproveitar APIs já existentes. Outra alternativa é utilizarmos a API de Properties, que nos provê a facilidade de ler e escrever valores de propriedades (preferências) num arquivo de configuração. Porém, nenhuma dessas alternativas resolve o problema adequadamente. Nenhuma delas oferece, por exemplo, distinção entre preferências do usuário e preferências do sistema. Java, entretanto, possui uma API desenvolvida especialmente para este fim, a API de Preferences. Com ela, a tarefa de armazenar e recuperar as preferências do usuário e/ou sistema torna-se absurdamente simples. Tudo que precisamos fazer é obter um objeto Preferences relativo ao nó de preferências da nossa aplicação (ex.: através do método Preferences.userRoot().node(“com/app/pref”)) e a partir daí chamar os métodos get(), para recuperar, e put(), para armazenar o valor de alguma preferência através de sua chave.

 

Armazenar as preferências do usuário é uma funcionalidade presente em grande parte das aplicações que utilizamos no dia a dia. Estamos tão acostumados a essa facilidade que, muitas vezes, nem nos damos conta de que existem algumas dezenas ou até milhares de linhas de código responsáveis por essa característica. E não estamos falando apenas de preferências configuradas diretamente pelo usuário, como a página inicial do browser ou tamanho da fonte de um editor de texto. Estamos nos referindo também às preferências armazenadas implicitamente pelas aplicações. Um exemplo típico dessa situação acontece quando salvamos uma imagem a partir do browser e, em seguida, pedimos para salvar outra. Nesses casos, o browser geralmente armazena o diretório onde salvamos a última imagem e, na segunda vez, já abre o diálogo de "Salvar" neste mesmo diretório para facilitar nossa vida. Características simples como essa, às vezes despercebidas, podem fazer uma enorme diferença na usabilidade da aplicação e, conseqüentemente, na satisfação do usuário final.

Começamos a atinar mais para a importância dessa característica quando sentimos sua falta. Isso é bastante comum quando estamos desenvolvendo alguma aplicação, principalmente desktop, e não implementamos o suporte a esse tipo de facilidade. A Listagem 1 mostra o código da classe FileContentViewer. Esta classe representa uma aplicação Swing bem simples, que apenas lê um arquivo texto e exibe seu conteúdo na tela. O método initializeUIComponents() é responsável por montar a interface gráfica, enquanto o método loadFile() mostra um JFileChooser para que o usuário selecione um arquivo e, uma vez selecionado, mostra seu conteúdo no JTextArea. Compile o código e em seguida crie um arquivo para testes (teste.txt, por exemplo) contendo um texto qualquer na Área de trabalho. Agora rode a aplicação e utilize o arquivo criado para testá-la. Sem problemas! Certo? Vamos analisar. Quando usamos um objeto JFileChooser sem especificar o diretório inicial, como no exemplo, e exibimos o dialogo “Open” (Abrir), este geralmente é aberto mostrando a pasta Meus Documentos[1], forçando o usuário a navegar até a pasta onde se encontra o arquivo desejado (a “Área de trabalho” no nosso caso). Isso pode aparentar não ser problema quando usamos a aplicação uma única vez para abrir um único arquivo. Mas, imagine se formos abrir dezenas de arquivos continuamente? Você certamente não vai gostar de ter que repetir as mesmas operações de navegação a todo o momento. O usuário certamente não ficará muito satisfeito com a usabilidade da aplicação. Como podemos ver, a capacidade que uma aplicação possui de armazenar as preferências, explícitas e implícitas, do usuário faz uma enorme diferença em sua usabilidade.

Existem diversas maneiras de se implementar essa característica, mas o que muitos não sabem é que o próprio Java possui uma API desenvolvida especificamente para esse fim. Neste artigo veremos algumas das formas que geralmente são utilizadas para realizar essa tarefa e a solução oferecida pelo Java, a Java Preferences API.

 

Listagem 1. Aplicação Swing que mostra o conteúdo de um arquivo texto

// Declaração de pacote e imports omitidos

public class FileContentViewer extends JFrame {

  private JButton btnOpenFile;

  private JLabel lblFileContent;

  private JTextArea txaFileContent;

  public FileContentViewer() {

    super("File Content Viewer");

    initalizeUIComponents();

  }

  private void initalizeUIComponents() {

    Container container = getContentPane();

    setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));

    btnOpenFile = new JButton("Open File...");

    btnOpenFile.addActionListener(new ActionListener() {

      public void actionPerformed(ActionEvent e) {

        try {

          loadFile();

        } catch (IOException ex) {

          JOptionPane.showMessageDialog(FileContentViewer.this,

              "Error opening file.", "Error", JOptionPane.ERROR_MESSAGE);

        }

      }

    });

    container.add(btnOpenFile);

    lblFileContent = new JLabel("File Content:");

    container.add(lblFileContent);

    txaFileContent = new JTextArea();

    txaFileContent.setRows(20);

    txaFileContent.setColumns(50);

    container.add(new JScrollPane(txaFileContent));

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ...

Quer ler esse conteúdo completo? Tenha acesso completo