как остановить JPopupMenu show () от визуального отмены выбора элемента списка, на который нажали - PullRequest
0 голосов
/ 28 января 2010

Прямо сейчас, когда пользователь щелкает правой кнопкой мыши по выбранному элементу JList в моей программе, результирующее JPopupMenu очищает выбор (по крайней мере визуально), пока не закроется всплывающее меню. Это не соответствует нативному внешнему виду любой платформы, о которой я знаю. Элемент должен оставаться визуально выбранным или иметь выделенную рамку цвета вокруг него. Но я не могу найти ничего в API о всплывающих меню, изменяющих внешний вид выбора. Есть ли способ, которым я могу контролировать это поведение?

1 Ответ

2 голосов
/ 28 января 2010

Как вы реализуете свой Mouse Listener, который показывает всплывающее окно? Я создал тестовое приложение, чтобы продемонстрировать поведение выбора списка и всплывающих меню, которые я обычно ожидаю. В Windows с Java 1.5 / 6 это работает правильно.

Может быть, это поможет вам с вашей конкретной проблемой.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...