2011-01-31 36 views
8

我一直在为互联网寻找答案。我有一个简单的JList,里面有物品。当我点击右键时,我想要一个弹出菜单,显示“使用,删除,取消”或某种性质的东西。但是,我很难过。JList右键单击显示菜单(使用,放下,取消)

下面的代码将生成一个简单的JList,里面有几个项目。我尝试在代码中添加右键单击,但它不起作用。帮帮我?

这是我到目前为止有:

import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.MouseAdapter; 
import javax.swing.*; 



public class inv extends JApplet implements MouseListener { 

    JList listbox; 



    public void init() 
    { 


    String listData[] = { "Item 1","Item 2","Item 3","Item 4" }; 
listbox = new JList(listData); 

    listbox.addMouseListener(new MouseAdapter() 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      if (SwingUtilities.isRightMouseButton(e)) 
      { 
       listbox.setSelectedIndex(getRow(e.getPoint())); 
      } 
     } 
    }); 

    listbox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 


     add(listbox); 
        listbox.setVisible(true); 

      listbox.setFocusable(false); 

    } 



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

     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseEntered(MouseEvent e) { 
     } 

     public void mouseExited(MouseEvent e) { 
     } 

     public void mouseClicked(MouseEvent e) { 
     } 


    public void stop() 
    { 
    } 

    public void paint(Graphics g) 
    { 
    } 

} 

回答

5

我不知道你的意思。这里的代码看起来像你指定的那样工作,但除了取出任何数量的冗余或有问题的语句外,它几乎都是你发布的内容。

/* 
<applet code='inv' width='200' height='200'> 
</applet> 
*/ 
import java.awt.*; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseAdapter; 
import javax.swing.*; 

public class inv extends JApplet { //implements MouseListener { 

    JList listbox; 

    public void init() 
    { 


    String listData[] = { "Item 1","Item 2","Item 3","Item 4" }; 
listbox = new JList(listData); 

    listbox.addMouseListener(new MouseAdapter() 
    { 
     public void mousePressed(MouseEvent e) 
     { 
      System.out.println(e); 
      if (SwingUtilities.isRightMouseButton(e)) 
      { 
       System.out.println("Row: " + getRow(e.getPoint())); 
       listbox.setSelectedIndex(getRow(e.getPoint())); 
      } 
     } 
    }); 

    listbox.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     add(listbox); 
        // unnecessary 
        //listbox.setVisible(true); 

      listbox.setFocusable(false); 
    } 



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

/** Why implement MouseListener, while adding a MouseAdapter? 
Do you have ANY idea what your doing? 

     public void mousePressed(MouseEvent e) { 
     } 

     public void mouseReleased(MouseEvent e) { 
     } 

     public void mouseEntered(MouseEvent e) { 
     } 

     public void mouseExited(MouseEvent e) { 
     } 

     public void mouseClicked(MouseEvent e) { 
     } 
*/ 

    /** What is this nonsense supposed to achieve? 
    Don't override empty methods with empty implementations! 
    public void stop() 
    { 
    } 
    */ 

    /** What is this nonsense supposed to achieve? 
    public void paint(Graphics g) 
    { 
    } 
    */ 
} 

输出

java.awt.event.MouseEvent[MOUSE_PRESSED,(31,22),absolute(39,72),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 1 
java.awt.event.MouseEvent[MOUSE_PRESSED,(29,39),absolute(37,89),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 2 
java.awt.event.MouseEvent[MOUSE_PRESSED,(36,65),absolute(468,192),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 3 
java.awt.event.MouseEvent[MOUSE_PRESSED,(45,11),absolute(477,138),button=3,modifiers=Meta+Button3,extModifiers=Button3,clickCount=1] on javax.swing.JList[,0,0,200x200,alignmentX=0.0,alignmentY=0.0,border=,flags=50331944,maximumSize=,minimumSize=,preferredSize=,fixedCellHeight=-1,fixedCellWidth=-1,horizontalScrollIncrement=-1,selectionBackground=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],selectionForeground=sun.swing.PrintColorUIResource[r=51,g=51,b=51],visibleRowCount=8,layoutOrientation=0] 
Row: 0 

Tool completed successfully 
+0

对不起我所有的废话。这就是我被教导的方式。 (高中班) – nn2 2011-01-31 18:08:27

+0

如果能帮助解决问题,请[接受答案](http://meta.stackexchange.com/a/5235/155831)。 – 2015-12-27 05:14:45

4

一个典型的错误,可能是打电话JPopupMenu.setVisible(true)并希望事情发生。这个组件需要一个不同的方法来提出它。重写你的鼠标监听沿线:

listbox.addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       JPopupMenu menu = new JPopupMenu(); 
       JMenuItem item = new JMenuItem("Say hello"); 
       item.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         JOptionPane.showMessageDialog(inv.this, "Hello " 
           + listbox.getSelectedValue()); 
        } 
       }); 
       menu.add(item); 
       menu.show(inv.this, 5, listbox.getCellBounds(
         listbox.getSelectedIndex() + 1, 
         listbox.getSelectedIndex() + 1).y); 
      } 
     } 
    }); 

为了例如总之,我添加了一个项目只,但肯定更可以加入。我使用的显示方法还需要指定菜单应显示在组件上的哪个位置。该位置可以从列表本身获得,如本例所示。

1

根据以前的回答,下面的代码将立即选择项目(右键单击),并显示弹出旁边的鼠标点击。

listbox.addMouseListener(new MouseAdapter() { 
    public void mousePressed(MouseEvent e) { 
     if (SwingUtilities.isRightMouseButton(e)) {  
      listbox.setSelectedIndex(listbox.locationToIndex(e.getPoint())); 

      JPopupMenu menu = new JPopupMenu(); 
      JMenuItem itemRemove = new JMenuItem("Remove"); 
      itemRemove.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 

        // This could probably be improved, but assuming you also keep the values in an ArrayList, you can remove the element like this 
        //array_list.remove(listbox.getSelectedValue()); 
        //listbox.setListData((String[]) array_list.toArray(new String[array_list.size()])); 

        System.out.println("Remove the element in position " + listbox.getSelectedValue()); 

       } 
      }); 
      menu.add(itemRemove); 
      menu.show(listbox, e.getPoint().x, e.getPoint().y);    
     } 
    } 
}); 

有一个注释部分显示了删除项目的可能方法;它假定存在ArrayList(称为array_list),其中包含JList上元素的副本。它使用方法to_array以刷新JList。应该有一个更有效的方法,但是如果你的清单很短,那应该就足够了。

相关问题