最小化/移动JFrame时,JPopupMenu不会消失/移动

时间:2012-01-04 22:02:38

标签: swing jpopupmenu

我正在制作一个MP3播放器,我的JFrame中有几个JLists。当我右键单击JList项目时,会出现一个弹出窗口,其中包含该歌曲的一些选项。但是当这个弹出窗口可见时,我最小化了我的JFrame,这个弹出窗口仍然可见!此外,当弹出窗口可见时,我将JFrame拖到屏幕上的其他位置,弹出窗口保持在原始位置(因此它不会保持在相对于JFrame的相同位置)...有人可以请帮助我出来这个?我试图尽可能地删除这个课程:)

如果有人可以帮助我,我将非常感激!!

public class playListPanel extends JPanel implements MouseListener {
    private DefaultListModel model;
    private Interface interFace;
    private JList list;
    private boolean emptyPlaylist;
    private ArrayList<Song> currentPlayList;
    private Song rightClickedSong;
    private JPopupMenu popup;
    private Point panelLocation;

    public playListPanel(Interface interFace) // Interface extends JFrame,
                                                // playListPanel is a part of
                                                // this JFrame.
    {
        this.interFace = interFace;
        this.panelLocation = new Point(559, 146);
        setBackground(SystemColor.controlHighlight);
        setBorder(new TitledBorder(null, "", TitledBorder.LEADING,
                TitledBorder.TOP, null, null));
        setBounds((int) panelLocation.getX(), (int) panelLocation.getY(), 698,
                368);
        setLayout(null);

        currentPlayList = new ArrayList<Song>();

        model = new DefaultListModel();
        list = new JList(model);
        list.setVisible(true);
        list.addMouseListener(this);

        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setBounds(5, 5, 688, 357);
        add(scrollPane);

        emptyPlaylist = true;
    }

    private void openMenuPopup(Point point)
    {
        removePopup();
        popup = new JPopupMenu();
        int x = (int) point.getX();
        int y = (int) point.getY();
        popup.setLocation((int) (x+panelLocation.getX()),(int) (y+panelLocation.getY()));
        //popup.setLabel("popup voor playlist");
        JMenuItem removeSong;
        popup.add(removeSong = new JMenuItem("Remove Song from Playlist", new ImageIcon("image.jpg")));

        ActionListener menuListener = new ActionListener()
        {
              public void actionPerformed(ActionEvent event) 
              {
                if(event.getActionCommand().equals("Remove Song from Playlist"))
                {
                    System.out.println("Remove Song from Playlist");
                    interFace.getPlaylistManager().removeOneSong(rightClickedSong);
                    removePopup();
                }

        };

        //ADD THE LISTENERS TO THE MENU ITEMS
        removeSong.addActionListener(menuListener);
        popup.setVisible(true);
    }

    public void removePopup()
    {
        if(popup!==null)
        {
            popup.setVisible(false);
            System.out.println("popup removed");
        }
    }

    private int getRow(Point point) {
        return list.locationToIndex(point);
    }

    public void refreshPlayList(ArrayList<Song> playlist) {
        this.currentPlayList = playlist;

        model.clear();
        for (Song song : playlist) {
            model.add(model.getSize(), song.getPlaylistString());
        }
        list.setVisible(true);
    }

    public void highlightSong(int index) {
        list.setSelectedIndex(index);
    }

    public int getRowOfList(Point point) {
        return list.locationToIndex(point);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        interFace.getPlaylistManager().doubleClickOnPlaylist(e);
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
    }

    @Override
    public void mouseExited(MouseEvent arg0) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
        if (SwingUtilities.isRightMouseButton(e)) {
            rightClickedSong = currentPlayList.get(getRow(e.getPoint()));
            openMenuPopup(e.getPoint());
            System.out.println("should open popup at "
                    + e.getPoint().toString());
        }

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
    }
}

1 个答案:

答案 0 :(得分:1)

您处理点击以显示弹出窗口的方式存在一些基本缺陷。 不建议在这样的简单场景中调用popup.setVisible。相反,您可以依赖其默认行为。此外,最好使用e.isPopupTrigger()而不是检查SwingUtilities.isRightMouseButton(e)以显示弹出窗口。

您可以执行以下操作:

//at classlevel,
private JPopupMenu popup = new JPopupMenu();
//create a Popuplistener
PopupListener pl = new PopupListener();
list.addMouseListener(pl);

//Implementation of your popuplistener
  class PopupListener extends MouseAdapter {
    public void mousePressed(MouseEvent e) {
      maybeShowPopup(e);
    }

    public void mouseReleased(MouseEvent e) {
      maybeShowPopup(e);
    }

    private void maybeShowPopup(MouseEvent e) {
      if (e.isPopupTrigger())
        //e.getSource - and construct your popup as required.
        //and then.
        popup.show(((JApplet) e.getComponent()).getContentPane(), e
            .getX(), e.getY());
    }
  }