2010-01-28 50 views
0

現在,當用戶在我的程序選定的JList項目用鼠標右擊產生的JPopupMenu清除選擇(至少在視覺上),直到彈出菜單關閉了。這與我所瞭解的任何平臺的本地外觀和感覺都不一致。該項目應該保持視覺選擇或圍繞它具有選定的顏色邊框。但我無法在API中找到有關彈出式菜單更改選擇外觀的任何內容。有什麼辦法可以控制這種行爲嗎?如何從視覺上未選擇列表項停止JPopupMenu的節目()點擊

+1

你能發表一些你的代碼嗎?因爲這不是正常的JPopupMenu行爲(據我所知)! – Alex 2010-01-28 19:48:47

+0

哦男人,我很抱歉,我做了一個簡短的例子,你是對的。問題是由我的focusLost代碼清除了選擇引起的。我從來沒有想過,PopupMenu是一個不同的組件,正在變得焦點!感謝您的現實檢查! – 2010-01-28 20:07:21

回答

2

你是如何實現你的鼠標監聽,顯示彈出?我創建了一個測試應用程序來演示列表選擇和彈出菜單,我通常會期望的行爲。在具有Java 1.5/6的Windows上,這表現正確。

也許這將幫助您與您的特殊問題。

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); 
    } 
}