2017-03-02 98 views
-1

我有一个带有字符串的JList,它占据了JFrame的整个区域。问题是,当用户右键单击时,它不必在JFrame中的项目上。只要选择了一个项目,它就会弹出。所以你可以点击任何地方,然后右键点击任何地方,菜单会弹出。我该怎么做才能让用户右键单击JList中的某个项目时弹出菜单?这是我到目前为止有:如何在用户右键单击JList中的项目时弹出菜单?

list.addMouseListener(new MouseAdapter() 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      if (SwingUtilities.isRightMouseButton(e)) 
      { 
       JList list = (JList) e.getSource(); 
       int row = list.locationToIndex(e.getPoint()); 
       list.setSelectedIndex(row); 

       if(list.getSelectedIndex() != -1) 
       { 
        PopUpMenu menu = new PopUpMenu(); 
        menu.show(e.getComponent(), e.getX(), e.getY()); 
       } 
      } 
     } 
    }); 
+1

代码看起来很合理,除非在使用Swing时应该使用aJPopupMenu。不知道我明白这个问题。发布适当的[mcve]证明问题。 – camickr

+0

如果'JList'占据整个屏幕,则单击列表上的任何位置将生成鼠标事件。 – MadProgrammer

回答

1

也许您正在寻找这样的事情:

list.addMouseListener(new MouseAdapter() 
{ 
    public void mousePressed(MouseEvent e) 
    { 
     if (SwingUtilities.isRightMouseButton(e)) 
     { 
      JList list = (JList) e.getSource(); 

      int preferredHeight = list.getPreferredSize().height; 
      int mouseHeight = e.getPoint().y; 

      if (mouseHeight > preferredHeight) 
       return; 

      int row = list.locationToIndex(e.getPoint()); 
      list.setSelectedIndex(row); 
      // show JPopupMenu 
     } 
    } 
}); 

,而忽略列表中的最后一项下方的鼠标事件。

+1

必须测试SelectionModel.isSelected> -1 && SwingUtilities.isRightMouseButton,而不是以编程方式强制选择 – mKorbel

相关问题