2010-12-01 27 views
0

Je voudrais ajouter des éléments à une zone de liste sur une jframe, à partir d'une classe différente mais cela ne semble pas fonctionner, peu importe ce que j'essaie ... Je ne reçois pas d'erreur ou de commentaires sur ce qui ne va pas avec ... mais voici la mise en page que j'ai, la boîte de liste utilise DefaultListModel lm2comment ajouter des éléments à une zone de liste d'une autre classe dans netbeans

Je sais comment ajouter des éléments à un jList dans la classe jframe, mais pour une raison que je ne peux pas ajouter elments d'une autre classe, même lors de l'ajout de cette classe dans la DFrame:

public void log(String str) { 
     lm2.addElement(str); 
    } 

et sur mon « autre classe »

frmMain doit = new frmMain(); 

    doit.log("add to list box"); 
#

Plus de détails Add- --->

#

J'ai 3 classes et ici ils sont tous:

frmMain.class

// jFrame class which builds the jframe (from jframe template) 
    public class frmMain extends javax.swing.JFrame { 

     /** Creates new form frmMain */ 
     public frmMain() { 
      initComponents(); 
     } 



     public void log(String str) { 
      lm2.addElement(str); 
     } 



     public DefaultListModel lm2 = new DefaultListModel(); 
    } 

RequestInfo. classe

// RequestInfo.class, which is trying to add an item to the 
// jlist but it doesn't add anything or error 

public class RequestInfo { 

    public void ProcessReturnedInfo(String sData, boolean bWithLabel) { 


      frmMain fm = new frmMain(); 
      fm.log("test test"); 



} 

RS232Example.class

 // My main class which sets the jFrame to visible 
    public class RS232Example { 
     public static void main(String[] args) throws Exception { 


     frmMain form = new frmMain(); 
     form.setVisible(true); 

    } 

    } 

Je comprends que je dois peut-être mettre en forme pour visible sur le RequestInfo.class, mais je ne peux pas le faire, car il ouvrira en permanence la forme plusieurs fois, parce que cette méthode de classe est appelé plusieurs fois à partir d'un événement ...

+2

Qu'est-ce qu'une liste déroulante? Utilisez une terminologie appropriée lorsque vous posez une question. Si vous avez une référence à ListModel dans votre deuxième classe, alors la méthode addElement() devrait fonctionner. Publiez votre SSCCE (http://sscce.org) démontrant le problème. Le code que vous avez posté ne nous aide pas du tout. – camickr

+0

Souvent, ce problème est dû à l'une des références, que le composant sur lequel vous appelez des méthodes pour modifier les données n'est pas celui qui est visualisé à l'écran. Je vois que dans votre "autre classe" vous appelez le nouveau frmMain() - est la variable doit frmMain que nous voyons au-dessus de celle qui est visualisée, que vous appelez setVisible (true) sur (si c'est une JFrame)? Sinon j'appuie tout ce que Rob Camick recommande ci-dessus. –

+0

pour une raison quelconque, peu importe ce que j'essaie, je peux de nouveau référencer le DefaultListModel dans RequestInfo.class ... comment puis-je ajouter des éléments de cette classe? – jason

Répondre

2

si votre listBox modèle est configuré (comme listBox.setModel(this.lm2);) Je suppose que les éléments suivants devraient fonctionner:

public static void main(String[] args) throws Exception { 
    frmMain form = new frmMain(); 
    form.setVisible(true); 
    form.log("Hallo"); 
} 

Si vous vous demandez pourquoi cela fonctionne et le code dans RequestInfo ne pas garder à l'esprit, que vous créez un nouveau frmMain avec sa propre ListModel pour chaque appel de ProcessReturnedInfo

Si vous voulez avoir un seul cadre essai mis à jour pour utiliser le cadre comme singleton:

Change le constructeur de frmMain du public au privé et ajouter ce à la classe:

private static frmMain instance = null; 

public static frmMain getInstance() { 
    if (instance == null) { 
    instance = new frmMain(); 
    } 
    return instance; 
} 

Au lieu d'appeler new frmMain() vous devez maintenant utiliser frmMain.getInstance() dans RequestInfo et RS232Example

Voilà comment vous travaillez toujours sur le même châssis.

Bonne chance.

0

Quelle est votre autre classe? Je suppose que frmMain() crée un JFrame avec un JList dedans mais à moins que ce JFrame soit également rendu visible vous ne le verrez pas. Je suspecte - et je peux me tromper - que vous avez plus d'une instance d'un JFrame et que la chaîne est ajoutée à une autre qui n'est pas rendue visible.

Désolé été malade un moment mais je crois que Andreas L a la bonne réponse à votre problème. Vous n'avez pas nécessairement besoin d'un objet frame statique mais c'est le moyen le plus simple. Vous pouvez également rencontrer des problèmes si vous traitez plusieurs threads. Dans ce cas, vous aurez besoin de contrôler le traitement des requêtes, de mettre en file d'attente les données que vous n'avez pas terminées, etc.

Bonne chance.

+0

Je comprends ce que vous dites, je devrais mettre "form" à visible dans le RequestInfo.class, mais je ne peux pas le faire, parce que cette méthode est appelée plusieurs fois via un gestionnaire d'événements. C'est un projet RS232 (données de communication série) donc les données arrivent constamment et appellent constamment cette méthode dans RequestInfo.class. – jason