2017-09-27 4 views
0

J'ai une classe qui crée l'interface graphique qui suit la première fois que le bouton de l'arme est cliqué sur: enter image description hereLes composants de mon panneau ne sont pas tirées si JOptionPane est tiré

Chaque bouton sur le côté que je clique sur devrait passer à un panneau différent en conséquence. Cependant, actuellement, je travaille juste sur le panneau d'armes. Pour économiser de la mémoire, j'ai décidé d'enregistrer tout ce qui a été tapé dans la boîte de recherche et si l'utilisateur décide d'ouvrir à nouveau le panneau, l'application recherche à nouveau la liste. À l'heure actuelle, je ne dispose que d'un élément appelé test comme vous le voyez, mon problème est de savoir si je tape quelque chose dans la zone de recherche, ce n'est pas disponible et je passe des panneaux, ceci est mon résultat:

enter image description here

Le prévu le résultat est censé être le message d'erreur mais avec la boîte de recherche, les boutons et le JList encore disponible avec le JList montrant "No Weapons Listed".

Maintenant, quand je retire le JOptionPane je reçois le texte suivant qui est la moitié du résultat:

enter image description here

Je voudrais savoir pourquoi lorsque le message d'erreur apparaît le panneau n'est pas tiré?

PS: J'entré quelques messages de la console, l'un après l'JOptionPane et l'autre avant la déclaration de retour et ils ont tous deux faire imprimer correctement

Voici mon code pour le panneau:

private static JPanel searchMenu() { 

    JPanel pnl = new JPanel(); 
    pnl.setOpaque(false); 
    pnl.setLayout(new BorderLayout()); 

    Object[] search = search(); 

    if(search.length == 0) { 
     JOptionPane.showMessageDialog(MyFrame.getFrame(), 
        "No weapons with your search criteria has been found.\n" 
       + "What you type in the search box is searched for in the weapon names, classnames and their description.\n", 
       "No Weapon found", JOptionPane.ERROR_MESSAGE); 

     search = new Object[] {"No Weapons listed"}; 
    } 

    System.out.println(search.length); 

    DefaultListModel list = new DefaultListModel(); 
    for(Object o: search) list.addElement(o); 

    JList searched = new JList(); 

    searched.setModel(list); 
    searched.setPreferredSize(new Dimension(250, 700)); 
    searched.setFont(new Font("Tahoma", Font.PLAIN, 15)); 

    pnl.add(searched, BorderLayout.WEST); 

    pnl.add(weaponDisplay(lastSelec),BorderLayout.CENTER); 

    JPanel space = new JPanel(); 
    space.setOpaque(false); 
    pnl.add(space,BorderLayout.SOUTH); 

    return pnl; 
} 
+1

Pour une meilleure aide plus rapidement, postez un [MCVE] ou [Short, Self Contained, Example correct] (http://www.sscce.org/). –

Répondre

2

Il semble que vous ajoutez des composants à un conteneur après il a été rendu visible. Au minimum, vous devez validate() le conteneur englobant, comme indiqué here, et appeler éventuellement repaint(). Une meilleure approche consiste à ajouter le composant de vue, par ex. JList, à la mise en page et mettre à jour son modèle, par ex. ListModel, au besoin. Dans ce example, un JList écoute le modèle d'une table proche.

0

JOptionPane de les boîtes de dialogue sont modales, elles arrêtent donc l'exécution du code appelant jusqu'à la fermeture de la boîte de dialogue. Donc, vous voudrez peupler et montrer la liste d'abord, avec "Aucune arme répertoriée" comme son contenu, avant d'afficher la boîte de dialogue de message.

+0

Une fois la boîte de dialogue fermée, les composants du panneau ne sont toujours pas dessinés, mais l'impression est imprimée sur la console –

+0

search = new Object [] {"No Weapons listed"}; Il ne remplit pas le modèle de liste avec le nouveau contenu du tableau 'search'. – BinaryDigit09

+0

@ BinaryDigit09: Comme suggéré, [ici] (https://stackoverflow.com/a/18728637/230513) le dialogue modal bloque seulement l'interaction de l'utilisateur; il ne bloque pas les mises à jour. – trashgod