2010-06-24 4 views
0

Je suis en train de mettre des actions sur un ListSelectionListener personnalisé et bien que tout compile bien passé lorsque je sélectionne en fait un composant du JList il ne fonctionne pas.Java - JList: Custom ListSelectionListener question (SSCCE inclus)

Voici un extrait de code:

public class ListSelectionHandler implements ListSelectionListener 
{ 
    ListCustomObject o; 

    @Override 
    public void valueChanged(ListSelectionEvent e) 
    { 
      o = (ListCustomObject) app.MainWindow.jList1.getModel() 
        .getElementAt(e.getFirstIndex()); 

      new app.actions.Actions().createSetEdgeColorTo(o.getColor()); 
    } 

} 

L'action que je fais appel, travaille et il n'y a pas d'erreur lors de la compilation. Mais rien ne se passe réellement.

Je sais que je ne suis pas beaucoup de détails dans y compris ce code, je veux juste demander si je fais une erreur logique dans cet événement.

Merci d'avance!

EDIT: Ajout de l'action et l'initialisation de JList:

public Action createSetEdgeColorTo(Color color) 
    { 
     return new SetEdgeColorTo(color); 
    } 

    class SetEdgeColorTo extends AbstractAction 
    { 

     Color color; 

     SetEdgeColorTo(Color color) 
     { 

      super("Set new Edge Color"); 
      this.color = color; 
     } 

     @Override 
     public void actionPerformed(ActionEvent evt) 
     { 
      app.graph.GraphEdit.view.getGraph2D().getDefaultEdgeRealizer() 
               .setLineColor(color); 
      app.graph.GraphEdit.view.getGraph2D().updateViews(); 
     } 
    } 

et

JList jList1 = new javax.swing.JList(); 
ListSelectionModel listSelectionModel = jList1.getSelectionModel(); 
listSelectionModel.addListSelectionListener(new app.jlist 
              .ListSelectionHandler()); 

EDIT 3: Reworked SSCCE:

import java.awt.event.ActionEvent; 
import javax.swing.AbstractAction; 
import javax.swing.DefaultListModel; 
import javax.swing.JList; 
import javax.swing.ListSelectionModel; 
import javax.swing.event.ListSelectionListener; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.Action; 
import javax.swing.JFrame; 

public class SSCCE 
{ 

    static JList jList1; 

    public static void main(String[] args) 
    { 

     JFrame frame = new JFrame(); 
     jList1 = new JList(); 
     ListSelectionModel listSelectionModel = jList1.getSelectionModel(); 
     listSelectionModel.addListSelectionListener(
       new ListSelectionHandler()); 
     DefaultListModel listModel = new DefaultListModel(); 
     jList1.setModel(listModel); 
     listModel.addElement("String"); 
     listModel.addElement("String two"); 

     frame = new JFrame(); 
     frame.setDefaultCloseOperation(1); 
     frame.add(jList1); 
     frame.pack(); 
     frame.setVisible(true); 

    } 
} 

class ListSelectionHandler implements ListSelectionListener 
{ 
    @Override 
    public void valueChanged(ListSelectionEvent e) 
    { 

     System.out.println("" + e.getFirstIndex()); 
     new Actions().createTestAction(); 
    } 
} 

class Actions 
{ 

    public Action createTestAction() 
    { 
     return new TestAction(); 
    } 

    class TestAction extends AbstractAction 
    { 

     TestAction() 
     { 
      super("Test Action"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent evt) 
     { 
      System.out.println("Test Action Fired!"); 
     } 
    } 
} 

Ce SSCCE décrit le problème exact avec un échantillon TestAction qui ne tire pas encore .

+0

Question évidente, mais avez-vous ajouté une instance de cet écouteur à JList via 'addListSelectionListener'? –

+0

Oui je l'ai bien sûr et je l'ai testé avec quelques "S.out" et ça répond bien. – kxk

+0

Votre SSCCE ne compile pas donc vous ne comprenez toujours pas l'acronyme. Le rendu et l'objet personnalisé sont introuvables. Mais le point est-il nécessaire pour la description de votre problème? Vous essayez d'exécuter du code lorsque la sélection change. Si un rendu personnalisé est pertinent pour ce problème? J'en doute tellement pour m'en débarrasser. L'objet personnalisé est-il pertinent? Encore une fois je doute qu'il suffit d'ajouter des cordes au modèle. Le but du SSCCE est de simplifier tout le monde pour que vous sachiez que vous ne faites pas une erreur idiote. – camickr

Répondre

0

Alors, qu'essayez-vous exactement de faire?

Si vous essayez de définir la couleur d'une ligne qui a été sélectionné, ce code doit être fait dans le moteur de rendu. En général chaque fois que vous jouez avec des couleurs dans un moteur de rendu dont vous avez besoin du chèque:

if (! isSelected) 
    // do you custom rendering 

De cette façon, la ligne affichera toujours la valeur par défaut soulignant que vous sélectionnez des lignes différentes.

Et bien sûr, un SSCCE doit encore être affiché parce que nous avons aucune idée de ce que votre action personnalisée tente de faire et ne peut donc pas faire des suggestions réelles.

Modifié:

Il ne fait rien parce que tout votre code est en train de faire est la création de l'action. Si vous voulez invoquer l'action alors le code devrait être quelque chose comme:

new Actions().createTestAction().actionPerformed(null); 

En réalité, il n'y a pas besoin de créer une action réelle, il vous suffit d'appeler directement une méthode qui fait ce que vous voulez. La raison pour laquelle vous créez une action serait si vous vouliez ajouter l'Actdion à un JButton ou un JMenuItem afin que l'utilisateur puisse cliquer sur le composant pour invoquer l'Action.

+0

Ok ok, tout d'abord l'action est supposée faire quelque chose de complètement hors de propos pour le jList. Il est supposé donner une couleur à un EdgeRealiser de yFiles. Le problème est que vous ne serez pas capable de compiler et d'exécuter un SSCCE si vous n'avez pas de fichiers yFiles et je crois que cela ne va pas vraiment aider. La question est, y a-t-il une bonne raison pour que cette action, telle qu'elle est mise en œuvre ici, ne fonctionne pas? – kxk

+0

Si vous ajoutez un System.out.println à la méthode et que vous voyez l'affichage, le code sera alors exeucté. C'est juste une question de si vous avez implémenté le code correctement. Vous n'avez pas posté la mise en œuvre de l'action, donc nous ne pouvons pas dire si cela devrait fonctionner ou non. Vous n'avez pas posté le code dans lequel vous avez ajouté l'écouteur au composant, donc nous ne savons pas si vous le faites correctement. Comme je vous l'ai dit lors de votre dernière publication, nous n'avons pas le temps de jouer 20 questions en devinant ce que vous avez peut-être oublié de coder. – camickr

+0

Comme j'ai répondu ci-dessus, j'ai fait tous les tests "s.out" nécessaires et l'auditeur répond. Je ne peux pas poster un SSCCE ici parce que mon programme a besoin d'un package yFiles qui n'est pas gratuit, donc la plupart des gens ne pourront pas compiler encore mais je modifierai mon post et ajouterai d'autres snippets comme l'action et l'initialisation jList . – kxk