java JList 右键单击显示菜单(使用、删除、取消)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4854185/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JList Right-click shows menu (Use, drop, cancel)
提问by test
I've been scouring the internet for this answer. I have a simple JList with items inside it. When I right-click, I want a menu to pop-up that says "Use, drop, cancel" or something of that nature. HOWEVER, I'm stumped.
我一直在网上搜索这个答案。我有一个简单的 JList,里面有项目。当我右键单击时,我希望弹出一个菜单,上面写着“使用、删除、取消”或类似的东西。然而,我很难过。
The code below will produce a simple JList with a few items inside. I tried adding a right-click in the code but it doesn't work. Help?
下面的代码将生成一个简单的 JList,其中包含一些项目。我尝试在代码中添加右键单击,但它不起作用。帮助?
Here is what I have so far:
这是我到目前为止所拥有的:
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)
{
}
}
回答by Andrew Thompson
I do not know what you mean. Here is code that seems to work like you specify, but apart from taking out any number of redundant or buggy statements, it is pretty much what you posted.
我不知道你想表达什么意思。这里的代码似乎像您指定的那样工作,但除了删除任意数量的冗余或错误语句外,它几乎就是您发布的内容。
/*
<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)
{
}
*/
}
Output
输出
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
回答by Audrius Meskauskas
One of the typical mistakes may be to call JPopupMenu.setVisible(true)
and expect something to happen. This component needs a different method to bring it up. Rewrite your mouse listener along the lines:
典型的错误之一可能是打电话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);
}
}
});
To make example short, I add one item only but surely more can be added. The show method I use also requires to specify where on the component the menu should appear. The location can be obtained from the list itself as seen in this example.
为了使示例简短,我只添加了一项,但肯定可以添加更多。我使用的 show 方法还需要指定菜单应该出现在组件上的哪个位置。如本例所示,可以从列表本身获取位置。
回答by toto_tico
Based in the previous to answers, the below code would immediately select the item(on right click), and display the pop up next to the mouse click.
根据前面的答案,下面的代码将立即选择项目(右键单击),并在鼠标单击旁边显示弹出窗口。
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 with 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);
}
}
});
There is a commented section that shows a possible way of removing the item; it assumes the existence of an ArrayList
(called array_list
) that contains a copy of the elements on the JList
. It used the method to_array
in order to refresh the JList
. There should be a more efficient way, but if your list is short, it should be sufficient.
有一个注释部分显示了删除项目的可能方法;它假定存在一个ArrayList
(称为array_list
),其中包含 上元素的副本JList
。它使用该方法to_array
来刷新JList
. 应该有更有效的方法,但如果您的列表很短,应该足够了。