JPopupMenu не исчезает / не перемещается при сворачивании / перемещении JFrame, в котором он находится - PullRequest
2 голосов
/ 05 января 2012

Я делаю mp3-плеер с несколькими списками JL в моем JFrame.Когда я щелкаю правой кнопкой мыши на элементе 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 Ответ

1 голос
/ 05 января 2012

Существуют некоторые основные недостатки в обработке клика для отображения всплывающего окна.Не рекомендуется вызывать 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());
    }
  }
...