2011-12-22 9 views
8

Estoy tratando de hacerlo para que cuando un usuario haga clic en algo en mi GUI (es irrelevante), desaparecerá uno JTable y otro JComponent lo reemplazará.La forma correcta de "cambiar" un componente en Java

En el momento en que estoy usando el siguiente código, donde contentPanel es el JPanel me puse como panel de contenido del JFrame 's:

contentPanel.remove(table); 
contentPanel.add(component, BorderLayout.CENTER); 
contentPanel.updateUI(); 

que funciona perfectamente, pero sólo quiero confirmar que este es el método correcto. Quiero decir, no puedo pensar en otra forma de lograrlo, pero eso no significa necesariamente nada y si hay una forma mejor de hacerlo, en términos de rendimiento o cualquier otra cosa, me gustaría saberlo ...

+0

Eso me parece bien – GETah

+0

Gracias por el comentario @GETah – Andy

+1

Pero el comentario es incorrecto. NO deberías usar updateUI() (no sé cómo votar un comentario o lo hubiera hecho). No tengo idea de dónde la gente sigue teniendo la idea de usar updateUI(). Está presente en todos los foros a los que pertenezco. – camickr

Respuesta

14

No, esa NO es la manera de hacerlo. Nunca deberías invocar updateUI(). Lee la API, ese método solo se usa cuando cambias la LAF.

Después de añadir/eliminar los componentes que debe hacer:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); // sometimes needed 

(que es lo que irrevelevant), una JTable desaparecerá y otra JComponent lo reemplazará.

Quizás es relevante. Por lo general, una JTable se muestra en un JScrollPane. Entonces quizás una mejor solución es usar:

scrollPane.setViewportView(anotherComponent); 

y luego el scrollpane hará la validación por usted.

+0

Gracias por eso, he cambiado mi código y todavía funciona. Aparte de ese pequeño problema, ¿hay algo más que deba cambiar en mi código? – Andy

+0

Gracias por la edición, ¡eso también es bastante útil para saberlo también! – Andy

+0

¡Aunque para su información, el componente que dije que era irrelevante era en realidad el componente en el que el usuario hizo clic, y no se mostró (o eliminó)! – Andy

7

Una mejor manera es usar un CardLayout, y agregar ambas tablas, luego simplemente mostrar la tarjeta/tabla correcta.

+0

Eso es sólo una preferencia, ¿no? O afectará drásticamente el rendimiento de mi código? – Andy

+0

CardLayout es útil cuando reemplaza un panel de entierro con múltiples componentes en cada panel. Es decir, siempre que vea código use el método replaceAll() es un candidato para un CardLayout. Al usar un CardLayout, ambas tarjetas están en la memoria al mismo tiempo, por lo que utilizará memoria extra. – camickr

+0

@camickr: ¿CardLayout usará más memoria incluso si tuviera que inicializar ambos componentes? Cuando agrega componentes a un JPanel, ¿usa más memoria? – Andy

Cuestiones relacionadas