2010-01-28 2 views
0

À l'instant où un utilisateur clique droit sur un élément JList sélectionné dans mon programme le JPopupMenu résultant efface la sélection (au moins visuellement) jusqu'à ce que le menu contextuel est fermé. Cela ne correspond pas à l'aspect et à la convivialité d'une plate-forme que je connais. L'élément doit rester visuellement sélectionné ou avoir une bordure de couleur sélectionnée autour de lui. Mais je ne trouve rien d'autre dans l'API à propos des menus contextuels qui modifient l'apparence de la sélection. Est-ce que je peux contrôler ce comportement?comment arrêter JPopupMenu show() de désélectionner visuellement l'élément de la liste cliqué sur

+1

Pouvez-vous poster un peu de votre code? Parce que ce n'est pas le comportement normal de JPopupMenu (pour autant que je sache)! – Alex

+0

Oh mec, je suis désolé, j'ai fait un petit exemple et vous avez raison. Le problème a été causé par mon code focusLost qui efface la sélection. Il ne m'est jamais venu à l'esprit que le PopupMenu est un composant différent qui obtient le focus! Merci pour la vérification de la réalité! –

Répondre

2

Comment implémentez-vous votre Mouse Listener qui affiche le popup? J'ai créé une application de test pour démontrer le comportement des sélections List et des menus contextuels auxquels je m'attendais généralement. Sous Windows avec Java 1.5/6, ce comportement est correct.

Peut-être que cela vous aidera avec votre problème particulier.

package jlist; 

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.AbstractAction; 
import javax.swing.Action; 
import javax.swing.JFrame; 
import javax.swing.JList; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.event.ListSelectionEvent; 
import javax.swing.event.ListSelectionListener; 

public class Test extends JPanel implements ListSelectionListener { 
    private static final String ACTION_FEED = "Feed"; 
    private JList list; 
    private JPopupMenu menu; 
    // Initialise a JList and add to JPanel. 
    public Test() { 
     super(new BorderLayout()); 
     list = new JList(new Object[]{"Badger", "Ferret", "Stoat", "Weasel"}); 
     initActions(); 
     list.addListSelectionListener(this); 
     // Add mouse listener 
     list.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       if (e.isPopupTrigger()) showPopup(e); 
      } 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       if (e.isPopupTrigger()) showPopup(e); 
      } 
      private void showPopup(MouseEvent e) { 
       menu.show(e.getComponent(), e.getX(), e.getY()); 
      } 
     }); 
     add(new JScrollPane(list), BorderLayout.CENTER); 
     valueChanged(null); 
    } 

    // Triggered when List Selection changes. Used to control Actions enabled state. 
    public void valueChanged(ListSelectionEvent e) { 
     boolean selected = list.getSelectedValue() != null; 
     getActionMap().get(ACTION_FEED).setEnabled(selected); 
    } 

    // Initialise Actions and Popup Menu 
    private void initActions() { 
     menu = new JPopupMenu(); 
     Action feed = new AbstractAction(ACTION_FEED) { 
      public void actionPerformed(ActionEvent e) { 
       String value = (String) list.getSelectedValue(); 
       JOptionPane.showMessageDialog(Test.this, "Fed " + value); 
      } 
     }; 
     getActionMap().put(ACTION_FEED, feed); 
     menu.add(feed); 
    } 

    public static void main(String [] args) { 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(new Test()); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 
} 
Questions connexes