Я делаю 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) {
}
}
пожалуйста узнать яву соглашения об именовании и придерживаться их – kleopatra
Всегда следовать ветрам рамок вы используете, не бороться с ним :-) Для Качелей, что подразумевает, что _never-ever_ использует ручную калибровку/определение дочерних компонентов (иначе: нулевой макет) - вместо этого изучите и используйте соответствующий LayoutManager. Для всех фреймворков, которые подразумевают чтение некоторого базового учебника/учебника, чтобы узнать ... ну .. основные вещи и пойти оттуда (против свободного экспериментирования). Хороший стартер - это онлайн-учебник snoracle, специально http://docs.oracle.com/javase /tutorial/uiswing/components/menu.html – kleopatra
@kleopatra Спасибо за ваш ответ! Я действительно не тратил время на Layout Manager, о котором я сейчас сожалею, потому что я сделал всю программу нулевым макетом ... Я скоро это проверю. Какие именованные ошибки вы имеете в виду? Это интерфейс InterFace? (Извините, я новичок в этом, и я, вероятно, сделал целую кучу странных ошибок ..) – Joe