JTabbedPane: solo se dibuja la primera pestaña, la segunda siempre está vacía (novato Q)

Creé un JTabbedPane muy simple creando primero un objeto JTabbedPane vacío, luego 2 JPanels que luego agrego. Cada JPanel tiene un objeto que extiende JButton e implementa MouseListener. Cada uno de estos contiene una imagen diferente cargada desde un archivo; la imagen se mantiene localmente como una imagen almacenada en búfer y como un icono de imagen, etc., todo lo cual funciona muy bien. El objetivo de todo esto es permitir el cambio de tamaño de la imagen cuando se cambia el tamaño del botón (usando getscaledinstance ()), porque el panel cambia de tamaño, porque el JTabbedPane cambia de tamaño, etc., dentro del JFrame que contiene todo. Anulo paintComponent () para lograr esto en la clase que extiende JButton. Estoy usando MigLayout Manager, y todo está bien en ese frente controlando restricciones de diseño, crecimiento, relleno, tamaños iniciales, tamaños preferidos, etc. Las imágenes que contienen los botones son de diferentes tamaños y proporciones, pero esto no causó problemas antes.

Hasta hace 2 días todo funcionaba bastante bien. Hice algunos cambios tratando de modificar algunos problemas de cambio de tamaño mientras tomaba el administrador de MigLayout. En ese momento, estaba jugando con la configuración de varios tamaños mínimo, máximo y preferido utilizando los métodos proporcionados por los componentes, no el administrador de diseño. También engañé un poco con pack (), validate (), visible (), opaque (), etc., y sí, leí el artículo sobre pintura Swing y AWT aquí: http://java.sun.com/products/jfc/tsc/articles/painting/ , y cambié a confiar cada vez más en MigLayout. En una nota no relacionada, parece que JFrame no respeta el tamaño máximo.

De alguna manera, hoy, con y sin usar cualquiera de estos métodos proporcionados por swing, con o sin usar el administrador MigLayout para manejar algunos de estos asuntos, ahora tengo un JTabbedPane que muestra correctamente el PRIMER JPanel que agrego, pero NO EL SEGUNDO JPanel- -que, aunque está presente como una pestaña, no se muestra cuando se selecciona. He cambiado el orden de qué panel se agrega primero, y esto sigue siendo cierto independientemente del JPanel que agregue primero, lo que me dice que los JPanels están bien y que el problema es más probable en el JTabbedPane. Hago clic en la segunda pestaña, los interruptores de JTabbedPane, pero tengo lo que parece ser un botón en blanco en el JPanel. Algunas declaraciones de salida del sistema de la consola revelan lo siguiente: a) que el segundo panel y su botón están construidos b) no se capturan eventos del mouse cuando hago clic en el lugar donde deberían residir el segundo panel y el botón, como si no existiera en ese punto; c) cuando cambio a la segunda pestaña, el método paintComponent () anulado del botón dentro de ese segundo JPanel nunca se llama, por lo que, de hecho, nunca se pinta a pesar de que la pestaña en la que reside se vuelve visible; d) JTabbpedPane getComponentCount () devuelve un valor correcto de 2 después de agregar el segundo panel; e) El administrador de MigLayout realmente es genial, pero estoy divagando ...

Ahora no puedo volver a mi código anterior y, a pesar de mis mejores esfuerzos para deshacer los cambios que causaron esto, no puedo solucionar mi nuevo problema. He comentado todo menos las llamadas más esenciales: constructores para cada objeto, con MigLayout; add () para colocar los botones en los paneles usando argumentos de cadena apropiados para MigLayout; add () para colocar los paneles en JTabbedPane, también con argumentos de cadena MigLayout; establecer la operación predeterminada en el cierre para el JFrame; y configurando el JFrame visible. Esto significa que no juego con la configuración de optimización, la configuración de almacenamiento en búfer doble, la configuración opaca, sino que las dejo como predeterminadas, y aún así, sin solución; el segundo panel no se mostrará. Cada panel, debo agregar, cuando es el primero en cargarse, funciona bien, reafirmando nuevamente que los paneles y botones están bien.

Esto es parte de lo que estoy haciendo:

//Note: BuildaButton is a class that merely constructs my instances
File f = new File("/foo.jpg");
button1 = new BuildaButton().BuildaButton(f).buildfoo1Button();

f = new File("/foo2.jpg");
button2 = new BuildaButton().BuildaButton(f).buildfoo2Button();

MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(ml);
foo2panel.add(button2, "w 186:752:, h 200:807:");



tabs.add("foo1", foo1panel);
tabs.add("foo2", foo2panel);
System.out.println("contents of tabs: " + tabs.getComponentCount() + " elements");
mainframe.setLayout(ml2);
mainframe.setMinimumSize(new Dimension(850,800));
mainframe.add(tabs, "w 600:800:, h 780:780:");
//controlpanel is a still blank jpanel that holds nothing--it is a space holder for now & will be utilized
mainframe.add(controlpanel, "w 200:200:200, h 780:780:");
mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainframe.setVisible(true);

Gracias de antemano por cualquier ayuda que pueda brindar.

preguntado el 09 de enero de 11 a las 05:01

1 Respuestas

No puede usar la misma instancia de diseño en diferentes paneles. Simplemente cree una segunda instancia del diseño exactamente igual que ml y configúrelo en el segundo panel:

...
MigLayout ml = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout mla = new MigLayout("wrap 1", "[fill, grow]0[fill, grow]", 
   "[fill, grow]0[fill, grow]");
MigLayout ml2 = new MigLayout("wrap 2", "[fill, grow]5[fill, grow]", 
"[fill, grow]0[fill, grow]");

BorderLayout test = new BorderLayout(5,5);

foo1panel = new JPanel(ml);
foo1panel.add(button1, "w 234:945:, h 200:807:");

foo2panel = new JPanel(mla);
foo2panel.add(button2, "w 186:752:, h 200:807:");
...

Respondido el 09 de enero de 11 a las 12:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.