2012-03-31 14 views
6

Estoy usando una clase personalizada que amplía JFrame, pero a veces no muestra nada. Nunca tengo fallas, así que tengo curiosidad si es un comando de Java que puede ayudarme a imprimir algo. Busqué otras preguntas, pero no encontré nada similar. No estoy haciendo nada demasiado loco, pero tengo curiosidad por saber por qué sucede esto. Me gustaría corregir el problema para evitar problemas futuros.La GUI de Java se compila sin errores, pero a veces no muestra nada


blanco
enter image description here
GUI
enter image description here

public MemberPanel(int i) throws IOException { 
    Container contentPane = getContentPane(); 
    GridLayout layout = new GridLayout(2, 1); 
    contentPane.setLayout(layout); 
    setVisible(true); 
    setLocation(0, 0); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setSize(640, 170); 
    setResizable(false); 

    greenStatus = new JButton("Non-Critical"); 
    yellowStatus = new JButton("Important"); 
    redStatus = new JButton("Mission Critical"); 

    greenStatus.setFont(fontTextOne); 
    yellowStatus.setFont(fontTextOne); 
    redStatus.setFont(fontTextOne); 

    greenStatus.addActionListener(this); 
    yellowStatus.addActionListener(this); 
    redStatus.addActionListener(this); 

    buttonPanel.add(greenStatus); 
    buttonPanel.add(yellowStatus); 
    buttonPanel.add(redStatus); 

    statusLabel = new JLabel("In 75 letters or less... What are you working on?"); 
    statusLabel.setVerticalAlignment(JLabel.CENTER); 
    statusLabel.setHorizontalAlignment(JLabel.CENTER); 
    statusLabel.setFont(fontTextTwo); 
    textFieldPanel.add(statusLabel); 
    textFieldPanel.add(statusMessage); 

    contentPane.add(buttonPanel); 
    contentPane.add(textFieldPanel); 

} 
+0

Los objetos Swing GUI deben construirse y manipularse _sólo_ en el [thread de envío del evento] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

Respuesta

10

Has añadido un montón de componentes después llamando setVisible(true) en el JFrame:

public MemberPanel(int i) throws IOException { 
    Container contentPane = getContentPane(); 
    GridLayout layout = new GridLayout(2, 1); 
    contentPane.setLayout(layout); 
    setVisible(true); // ****** here 

    // ..... 

    // only now do you add components... 
    contentPane.add(buttonPanel); 
    contentPane.add(textFieldPanel); 

} 

Y, por lo tanto, los componentes pueden aparecer o no en función de si la GUI se repinta o no (consulte qué sucede cuando cambia el tamaño de la GUI vacía). Solución: llame a setVisible(true) solo después de agregando todo.

+0

¿Debería incluso extender 'JFrame'? ¿Por qué no simplemente agrega su interfaz de usuario al panel de contenido de un marco normal? –

+0

@Shakedown: ¿Qué es un marco "* normal"? Nunca he oído hablar de esto. –

+0

@Shakedown: Sí, soy un gran partidario de no extender los componentes si no estás alterando sus comportamientos fundamentales, así que sí, probablemente sería mejor usar * un JFrame en lugar de * extender * un JFrame, pero esa no es la causa principal de su problema actual. –

Cuestiones relacionadas