2016-09-27 5 views
0

Я хочу различные пункты меню в контекстном меню в зависимости от ряда я щелкнул в JTableDynamic (реальное) контекстное меню для 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)

общественного недействительными шоу (Component Вызывающий, Int х, Int у)

Отображает всплывающее окно меню в позиции x, y в координатном пространстве компонента invoker.

Параметры:

  • инициатора вызова - компонент в пространство которой всплывающее меню должен появиться
  • х - координата х в Вызывающий координатных пространство, на котором всплывающее меню, которое будет отображаться
  • 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

удивительно, спасибо ооочень много – fdsfdsfdsfds

+1

@fdsfdsfdsfds, не забудьте «принять» ответ, нажав на флажок, чтобы люди знают, что проблема была решена. – camickr