Dúvida de desempenho (CardLayout)

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…

[code]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
[/code]
Depois no [i]actionPerformed(ActionEvent e)[/i] 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?

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!

[quote=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 (…)

[/quote]

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: )

É 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…

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…