2016-09-27 52 views
0

(實際)上下文菜單我想這取決於我在JTable單擊行中的上下文菜單不同的菜單項動態的JTable中列

大多數的例子並不真正顯示上下文菜單(應該取決於被填充上下文 - 所選擇的行)

我嘗試這樣做:

popupMenu = new JPopupMenu(){ 
     @Override 
     public void show(Component invoker, int x, int y) { 
      int rowAtPoint = table.rowAtPoint(SwingUtilities.convertPoint(this, new Point(x, y), table)); 
       FilesManager.this.generateTablePopupMenu(rowAtPoint); 
      super.show(invoker, x, y); 
     } 
    }; 

其中generateTablePopupMenu被添加/移除根據行數據的菜單項

,但它不工作,則指數(rowAtPoint)不返回正確的值

回答

2

JPopupMenu#show(int, int) (Java Platform SE 8)

公共無效秀(組件調用,詮釋的x,int y)對

顯示彈出菜單位於組件調用者的座標空間中的位置x,y處。

參數:

  • 調用 - 在其空間的彈出菜單出現在組件
  • X - x座標在調用者的座標,其彈出菜單是要顯示
  • 空間
  • y - 要顯示彈出式菜單的調用者座標空間中的y座標

因此,不需要使用SwingUtilities.convertPoint(...)方法轉換座標。

import java.awt.*; 
import javax.swing.*; 
import javax.swing.table.*; 

public class JTablePopupMenuTest { 
    public JComponent makeUI() { 
    JTable table = new JTable(new DefaultTableModel(5, 3)); 
    table.setFillsViewportHeight(true); 
    JPopupMenu popupMenu = new JPopupMenu() { 
     @Override 
     public void show(Component invoker, int x, int y) { 
     //int rowAtPoint = table.rowAtPoint(
     // SwingUtilities.convertPoint(this, new Point(x, y), table)); 
     //FilesManager.this.generateTablePopupMenu(rowAtPoint); 
     int rowAtPoint = table.rowAtPoint(new Point(x, y)); 
     System.out.println(rowAtPoint); 
     super.show(invoker, x, y); 
     } 
    }; 
    table.setComponentPopupMenu(popupMenu); 

    JPanel p = new JPanel(new BorderLayout()); 
    p.add(new JScrollPane(table)); 
    return p; 
    } 
    public static void main(String... args) { 
    EventQueue.invokeLater(() -> { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JTablePopupMenuTest().makeUI()); 
     f.setSize(320, 240); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    }); 
    } 
} 
+0

驚人的,謝謝你的sooo多 – fdsfdsfdsfds

+1

@fdsfdsfdsfds,不要忘記通過點擊對勾讓人們知道這個問題已經解決了「接受」的答案。 – camickr