2012-01-04 3 views
2

Я делаю mp3-плеер с несколькими JLists в своем JFrame. Когда я нажимаю правой кнопкой мыши на элемент JList, появляется всплывающее окно с некоторыми параметрами для этой песни. Но когда это всплывающее окно видно, и я минимизирую свой JFrame, это всплывающее окно остается видимым! Кроме того, когда всплывающее окно видимо, и я перетаскиваю свой JFrame в другое место на экране, всплывающее окно остается на его исходной позиции (так что оно не остается в том же положении относительно JFrame) ... Может кто-то, пожалуйста, помогите мне с этим? Я старался как можно больше разбить этот класс :)JPopupMenu не исчезает/перемещается при минимизации/перемещении 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) { 
    } 
} 
+0

пожалуйста узнать яву соглашения об именовании и придерживаться их – kleopatra

+0

Всегда следовать ветрам рамок вы используете, не бороться с ним :-) Для Качелей, что подразумевает, что _never-ever_ использует ручную калибровку/определение дочерних компонентов (иначе: нулевой макет) - вместо этого изучите и используйте соответствующий LayoutManager. Для всех фреймворков, которые подразумевают чтение некоторого базового учебника/учебника, чтобы узнать ... ну .. основные вещи и пойти оттуда (против свободного экспериментирования). Хороший стартер - это онлайн-учебник snoracle, специально http://docs.oracle.com/javase /tutorial/uiswing/components/menu.html – kleopatra

+0

@kleopatra Спасибо за ваш ответ! Я действительно не тратил время на Layout Manager, о котором я сейчас сожалею, потому что я сделал всю программу нулевым макетом ... Я скоро это проверю. Какие именованные ошибки вы имеете в виду? Это интерфейс InterFace? (Извините, я новичок в этом, и я, вероятно, сделал целую кучу странных ошибок ..) – Joe

ответ

1

Есть некоторые основные недостатки в том, как вы обработке нажмите для показа всплывающего окна. В простых сценариях не рекомендуется звонить . Вместо этого вы можете полагаться на свое поведение по умолчанию. Кроме того, лучше использовать 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()); 
    } 
    } 
+0

Большое спасибо! Это исправило это! – Joe

+0

@ Joe рад, что это помогло. Если вам понравился ответ, подумайте о его принятии. Это также улучшает шансы получить ответы на ваши будущие вопросы в stackoverflow. –

Смежные вопросы