【问题标题】:how to stop JPopupMenu show() from visually un-selecting the list item clicked on如何阻止 JPopupMenu show() 从视觉上取消选择单击的列表项
【发布时间】:2010-01-28 19:29:35
【问题描述】:

现在,当用户在我的程序中右键单击选定的 JList 项目时,生成的 JPopupMenu 会清除选择(至少在视觉上),直到弹出菜单关闭。这与我所知道的任何平台的原生外观和感觉都不一致。该项目应保持视觉选择或在其周围具有选定颜色的边框。但我在 API 中找不到任何关于弹出菜单更改选择外观的信息。有什么办法可以控制这种行为?

【问题讨论】:

  • 你能发布一些你的代码吗?因为这不是正常的 JPopupMenu 行为(据我所知)!
  • 哦,对不起,我做了一个简短的例子,你是对的。问题是由我的 focusLost 代码引起的,它清除了选择。我从来没有想过 PopupMenu 是一个不同的组件,它正在获得焦点!感谢您的实际检查!

标签: java user-interface swing selection


【解决方案1】:

您如何实现显示弹出窗口的鼠标侦听器?我创建了一个测试应用程序来演示我通常期望的列表选择和弹出菜单的行为。在带有 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多