2011-01-31 18 views
8

Tôi đã tẩy sạch internet cho câu trả lời này. Tôi có một JList đơn giản với các mục bên trong nó. Khi tôi nhấp chuột phải, tôi muốn một trình đơn bật lên có nội dung "Sử dụng, bỏ, hủy" hoặc có tính chất gì đó. BAO GIỜ, tôi đang bối rối.JList Nhấp chuột phải vào menu hiển thị (Sử dụng, thả, hủy)

Mã bên dưới sẽ tạo ra một JList đơn giản với một vài mục bên trong. Tôi đã thử thêm một nhấp chuột phải vào mã nhưng nó không hoạt động. Cứu giúp?

Dưới đây là những gì tôi có cho đến nay:

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) 
    { 
    } 

} 

Trả lời

5

Tôi không biết những gì bạn có ý nghĩa. Đây là mã mà dường như làm việc như bạn chỉ định, nhưng ngoài việc lấy ra bất kỳ số lượng các câu lệnh thừa hoặc lỗi, nó là khá nhiều những gì bạn đăng.

/* 
<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 
+0

Xin lỗi về tất cả những điều vô nghĩa của tôi. Đó là cách tôi được dạy. (lớp trung học) – nn2

+0

Hãy [chấp nhận câu trả lời] (http://meta.stackexchange.com/a/5235/155831) nếu nó giúp giải quyết vấn đề. –

4

Một trong những sai lầm điển hình có thể gọi JPopupMenu.setVisible(true) và mong đợi một cái gì đó xảy ra. Thành phần này cần một phương pháp khác để đưa nó lên. Viết lại trình nghe chuột của bạn dọc theo các dòng:

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); 
      } 
     } 
    }); 

Ví dụ: tôi chỉ thêm một mục nhưng chắc chắn có thể thêm một mục nữa. Phương pháp hiển thị tôi sử dụng cũng yêu cầu chỉ định vị trí trên thành phần mà menu sẽ xuất hiện. Các vị trí có thể được lấy từ danh sách chính nó như được thấy trong ví dụ này.

+0

không [để trả lời] (http://stackoverflow.com/a/7427779/714968) bởi @kleopatra, logic là như nhau, JOptionPane nên bị trì hoãn trong invokeLater (không quan trọng) – mKorbel

+0

Không, như phương thức trình bao bọc invokeLater chỉ cần thiết khi gọi một phương thức trên đối tượng Swing từ chủ đề Swing không. Trong trường hợp của chúng ta, addActionListener sẽ được gọi trong chuỗi Swing. – h22

+4

Mã này ném một ngoại lệ khi cố gắng bật lên một menu trên mục cuối cùng trong danh sách. listbox.getSelectedIndex() + 1 trong trường hợp đó đề cập đến một phần tử danh sách không tồn tại. – Clyde

1

Dựa vào câu trả lời trước, mã bên dưới sẽ chọn ngay mục (nhấp chuột phải) và hiển thị cửa sổ bật lên bên cạnh nhấp chuột.

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);    
     } 
    } 
}); 

Có phần nhận xét cho thấy cách có thể xóa mục; nó giả định sự tồn tại của một ArrayList (được gọi là array_list) có chứa một bản sao của các phần tử trên JList. Nó đã sử dụng phương thức to_array để làm mới JList. Nên có một cách hiệu quả hơn, nhưng nếu danh sách của bạn là ngắn, nó phải là đủ.