Estoy tratando de renderizar un componente Swing personalizado donde amplié la clase JComponent.¿Cuándo getGraphics() devolverá una instancia de gráficos válida?
Con el propósito de simplificar los requisitos de los componentes, permite resumir que mi componente necesita renderizar algunas cadenas, cada una con sus propias fuentes.
Necesito que mi componente se ajuste exactamente al ancho y alto sumados de mis cadenas representadas.
Para determinar este tamaño, uso FontMetrics para calcular las dimensiones de cada cadena. Con esta información, puedo averiguar qué tamaño tendrá mi componente y cambiar su tamaño de manera apropiada.
El problema es que cuando accedo a getGraphics() siempre es nulo, por lo que no puedo obtener la instancia de FontMetrics. Si espero para calcular el tamaño de mi componente del método paintComponent() modificado, es demasiado tarde (el componente ya tiene un tamaño, ¿verdad?).
La documentación dice que "Este método devolverá nulo si este componente no se puede visualizar actualmente". Entonces, ¿cuándo sé cuándo el componente está listo para mostrarse y tengo un objeto Graphics para que cambie el tamaño de mi componente?
¿Cuál es el orden de invocación de Swing para representar el componente una vez que se ha llamado al marco setVisible (verdadero)?
Gracias
Actualizar: Martes, 06 de Febrero de 2010 a las 23:34
Como se ha mencionado abajo en los comentarios, el GridLayout no respeta ninguna setXxxSize() en absoluto. Para cualquier persona interesada, he publicado resultados del uso de GridLayout, BoxLayout y FlowLayout usando un marco simple que recibe 5 componentes de tamaño fijo de 200 de ancho por 50 de alto (estableciendo min, max y preferred).
Resultados de la prueba:
El GridLayout siempre se cambian de tamaño a lo largo de la anchura y altura (como se menciona en comentarios)
El FlowLayout siempre respetado los componentes de tamaño independientemente.
En cuanto a la la BoxLayout ...
El PAGE_AXIS y Y_AXIS se redujo la anchura de los componentes a aproximadamente la mitad de su tamaño (104), pero no se encogió la altura.
El LINE_AXIS y X_AXIS contrajo la altura de los componentes a lo que parecía cero, pero no tocó el ancho.
Veo que está creando su fuente? Cuando probé getFont(), la fuente es nula. ¿Asumo que un JComponent no tiene una fuente predeterminada? – Jeach
Un componente cuya fuente no está explícitamente establecida utiliza la fuente de sus padres. Si no tienes padres, entonces no tienes ninguna fuente. Sería mejor configurar explícitamente tu propia fuente en tu constructor. –
Gracias Jonathan! Configurar la fuente es lo que comencé a hacer. Ahora puedo representar el componente correctamente, pero por alguna razón este componente todavía se niega a dimensionarse según mis dimensiones. Si creo un marco con un diseño de cuadrícula (0 filas, 1 columna) y agrego 10 de mis componentes, entonces hago el cuadro a pantalla completa. Cada elemento obtiene 1/10 de la altura de la pantalla en altura cuando no deben ser mucho más pequeños. Configuré min, max, preferred, setSize() y de alguna manera se vuelve a su gusto. – Jeach