Dúvida de desempenho (CardLayout)

4 respostas
sergio.danilo

Olá pessoal...

Faço parte de uma equipe de desenvolvimento e estou com uma dúvida sobre desempenho em GUI Java!

No projeto que faço parte existe um software desktop que utiliza CardLayout para manipulação das telas a serem exibidas.

Pois bem, atualmente temos algo em torno de 13 JPanel diferentes, que são instaciados em tempo de compilação e adicionados ao JPanel principal, como a seguir:
JPanel showPanel = new JPanel();
showPanel.setLayout(new CardLayout());

...

JPanel tela1 = new JPanel();
showPanel.add(tela1, "tela1");

JPanel tela2 = new JPanel();
showPanel.add(tela2, "tela2");

...

JPanel tela13 = new JPanel();
showPanel.add(tela13, "tela13");
Minha dúvida: Fazer isso é "caro" para o sistema em termos de desempenho (os clientes dispõe de máquinas bem razoáveis), ou não existe problema em se fazer isso?

Outra solução que eu vejo seria a seguinte:

Criar um builder de JPanel, e a cada solicitação do menu do sistema, instanciar o JPanel referente e colocá-lo num mapa. Assim dessa forma eu não teria que criar todos os objetos e setá-los no JPanel principal, só os que necessariamente irei precisar...
public class BuilderPanel {

    static Map<String, JPanel> map;

    static {
        map = new HashMap<String, JPanel>();
    }

     public static JPanel getPanel(String nome) {
                    
        if (map.get(nome) == null) {
             Class<?> classe = Class.forName(nome);
             JPanel obj = (JPanel) classe.newInstance();
             map.put(nome, obj);
        }

        return map.get(nome);
    }

}//BuilderPanel
Depois no actionPerformed(ActionEvent e) eu faria a adição ao JPanel principal somente dos JPanel secundários que foram solicitados!
public void actionPerformed(ActionEvent e) {

    JPanel panel = BuilderPanel.getPanel(jPanelSolicitado);

    showPanel.add(panel, obterNomeTela(panel));

    CardLayout layout = (CardLayout) (showPanel.getLayout());
    layout.show(showPanel, jPanelSolicitado);

}//actionPerformed
Então... Qual o melhor estratégia das duas opções?

4 Respostas

lina

Oi,

Não vejo problemas em utilizar as 2 situações…

Porém como você está preocupado com performasse, para a segunda opção utilizar um WeakHashMap. Se souber utiliza-lo corretamente, melhoraria seu tempo de cache, limpando automaticamente o objeto pelo GC.

Tchauzin!

sergiotaborda

sergio.danilo:
Olá pessoal…

Faço parte de uma equipe de desenvolvimento e estou com uma dúvida sobre desempenho em GUI Java!

No projeto que faço parte existe um software desktop que utiliza CardLayout para manipulação das telas a serem exibidas.

Pois bem, atualmente temos algo em torno de 13 JPanel diferentes, que são instaciados em tempo de compilação (…)

Atenção. Nada é instanciado em tempo de compilação. As coisas são instanciadas em tempo de execução

Usar do primeiro jeito é muito melhor que o segundo. ficar procurando o painel do map tem um custo. Remover e colocer um objeto no container
tem um custo. A primeira opção é melhor porque não incorre nesses custos (aliás, porque vc acha que existe o cardlayout? :slight_smile: )

sergio.danilo

É tem razão, instanciar em tempo de compilação foi uma falha minha, me expressei errado.
O que eu queria dizer é que os objetos (telas) são todos instanciados quando o programa roda.

Eu também acho que a primeira solução é mais vantajosa, mas a equipe aqui resolveu mudar, a única solução que encontrei foi essa…

sergio.danilo

A segunda solução tem a vantagem de diminuir o acoplamento entre as classes. Não precisarei escrever a instanciação de uma nova tela criada no sistema…

Criado 22 de março de 2010
Ultima resposta 22 de mar. de 2010
Respostas 4
Participantes 3