0
現在,當用戶在我的程序選定的JList項目用鼠標右擊產生的JPopupMenu清除選擇(至少在視覺上),直到彈出菜單關閉了。這與我所瞭解的任何平臺的本地外觀和感覺都不一致。該項目應該保持視覺選擇或圍繞它具有選定的顏色邊框。但我無法在API中找到有關彈出式菜單更改選擇外觀的任何內容。有什麼辦法可以控制這種行爲嗎?如何從視覺上未選擇列表項停止JPopupMenu的節目()點擊
現在,當用戶在我的程序選定的JList項目用鼠標右擊產生的JPopupMenu清除選擇(至少在視覺上),直到彈出菜單關閉了。這與我所瞭解的任何平臺的本地外觀和感覺都不一致。該項目應該保持視覺選擇或圍繞它具有選定的顏色邊框。但我無法在API中找到有關彈出式菜單更改選擇外觀的任何內容。有什麼辦法可以控制這種行爲嗎?如何從視覺上未選擇列表項停止JPopupMenu的節目()點擊
你是如何實現你的鼠標監聽,顯示彈出?我創建了一個測試應用程序來演示列表選擇和彈出菜單,我通常會期望的行爲。在具有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);
}
}
你能發表一些你的代碼嗎?因爲這不是正常的JPopupMenu行爲(據我所知)! – Alex 2010-01-28 19:48:47
哦男人,我很抱歉,我做了一個簡短的例子,你是對的。問題是由我的focusLost代碼清除了選擇引起的。我從來沒有想過,PopupMenu是一個不同的組件,正在變得焦點!感謝您的現實檢查! – 2010-01-28 20:07:21