2012-03-31 6 views
6

J'utilise une classe personnalisée qui étend JFrame, mais parfois il ne montre rien. Je n'ai jamais de fautes, donc je suis curieux de savoir si c'est une commande Java qui peut m'aider à imprimer quelque chose. J'ai cherché d'autres questions, mais je n'ai rien trouvé de similaire. Pas vraiment faire quelque chose de fou, mais curieux de savoir pourquoi cela arrive. Je voudrais corriger le problème pour éviter les problèmes futurs.Java GUI compile sans erreurs, mais parfois ne montre rien


Blank
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

Les objets GUI Swing doivent être construits et manipulés _only_ sur le [thread d'envoi d'événement] (http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html). – trashgod

Répondre

10

Vous ajoutez un tas de composants après appeler setVisible(true) sur le 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); 

} 

Et ainsi les composants peuvent ou ne peuvent pas montrer selon si l'interface graphique repeint ou pas (voyez ce qui se produit quand vous redimensionnez l'interface graphique vide). Correction: appel setVisible(true) seulement après ajoutant tout.

+0

Devrait-il même étendre 'JFrame'? Pourquoi ne pas simplement ajouter votre interface utilisateur au volet de contenu d'un cadre normal. –

+0

@Shakedown: Qu'est-ce qu'un "cadre * * régulier" Je n'ai jamais entendu parler de ça –

+0

@Shakedown: Oui, je suis un grand croyant à ne pas étendre les composants si vous ne modifiez pas leurs comportements fondamentaux, alors oui, il serait probablement préférable * d'utiliser * un JFrame plutôt que * de prolonger * un JFrame, mais ce n'est pas la cause principale de son problème actuel: –