2017-02-24 53 views
0

我有一個JPopUpMenu添加到JTables中。我可以從彈出式管理中獲得我點擊過的表格。當我點擊菜單項時,如何將錶行傳遞給ItemMenu的ActionListener?如何將彈出菜單中的數據傳遞給actionlistener

mycode的:

package it.rex.view; 

import java.awt.Component; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JMenuItem; 
import javax.swing.JPanel; 
import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.JSeparator; 
import javax.swing.JTable; 
import javax.swing.border.EmptyBorder; 
import javax.swing.table.DefaultTableModel; 

import it.rex.model.Interventi; 

public class InterventiView extends JFrame { 

    private JPanel contentPane; 
    private JTable table; 
    private Interventi interventi; 



    public InterventiView(Interventi i) { 

     this.interventi = i; 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 500, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     setContentPane(contentPane); 
     contentPane.setLayout(null); 

     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setBounds(28, 56, 422, 153); 
     contentPane.add(scrollPane); 

     table = new JTable(); 
     DefaultTableModel dtm = new DefaultTableModel(0, 0); 

     // add header of the table 
     String header[] = new String[] { "Id", "Descrizione", "Stato", "Data inizio", "Tipo", "Responsabile" }; 

     // add header in table model  
     dtm.setColumnIdentifiers(header); 
     //set model into the table object 
       table.setModel(dtm); 

      // add row dynamically into the table 
      // for now only dummy data 
     for (int count = 1; count <= 3; count++) { 
       dtm.addRow(new Object[] { Integer.toString(count), "data", "data", 
         "data", "data", "data" }); 
     } 

     table.getColumnModel().getColumn(2).setResizable(false); 
     scrollPane.setViewportView(table); 

     // prepare PopupMenu 
     JPopupMenu popupMenu = new JPopupMenu(); 
     addPopup(table, popupMenu); 

     JMenuItem mntmAggiungiIntervento = new JMenuItem("Aggiungi Intervento"); 
     popupMenu.add(mntmAggiungiIntervento); 

     JMenuItem mntmModificaIntervento = new JMenuItem("Modifica Intervento"); 
     popupMenu.add(mntmModificaIntervento); 

     JSeparator separator = new JSeparator(); 
     popupMenu.add(separator); 

     JMenuItem mntmEliminaIntervento = new JMenuItem("Elimina Intervento"); 
     popupMenu.add(mntmEliminaIntervento); 

     JButton btnOk = new JButton("Ok"); 
     btnOk.setBounds(262, 220, 89, 23); 
     contentPane.add(btnOk); 

     JButton btnAnnulla = new JButton("Annulla"); 
     btnAnnulla.setBounds(361, 220, 89, 23); 
     contentPane.add(btnAnnulla); 

     //Manage action over popupMenu 
     mntmAggiungiIntervento.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       // Which row on JTable was selected? 
       System.out.println("Add " + arg0.getActionCommand()); 
      } 
     }); 

     mntmEliminaIntervento.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       // Which row on JTable was selected? 
       System.out.println("Delete"); 

      } 
     }); 

     mntmModificaIntervento.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       // Which row on JTable was selected? 
       System.out.println("Modify"); 

      } 
     }); 


    } 

    // Mouse events 
    private static void addPopup(Component component, final JPopupMenu popup) { 
     component.addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       if (e.isPopupTrigger()) { 
        showMenu(e); 
       } 
      } 
      public void mouseReleased(MouseEvent e) { 
       if (e.isPopupTrigger()) { 
        showMenu(e); 
       } 
      } 
      private void showMenu(MouseEvent e) { 
       popup.show(e.getComponent(), e.getX(), e.getY()); 

       // Identifico la riga 
       JTable table = ((JTable) component); 
       int tRaw = table.rowAtPoint(e.getPoint()); 

       if (tRaw >= 0 && tRaw < table.getRowCount()) { 
        table.setRowSelectionInterval(tRaw, tRaw); 
       } else { 
        table.clearSelection(); 
       } 

       System.out.println("Row: " + Integer.toString(tRaw+1)); 
      } 
     }); 


    } 

} 
+1

看看[如何使用動作](http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html) ,基本上我會創建一個或多個具有對錶格的引用並知道觸發時該做什麼的操作。我還會考慮看一看'JComponent#setComponentPopupMenu',它將允許它控制並確定何時顯示彈出框 – MadProgrammer

+1

避免使用'null'佈局,像素完美的佈局是現代UI設計中的一種幻想。影響組件的個體大小的因素太多,其中沒有一個可以控制。Swing旨在與佈局經理一起工作,放棄這些將導致無法結束的問題和問題,您將花費越來越多的時間來嘗試糾正。您可能想看看[爲什麼在SWING中使用空佈局不滿?](http://stackoverflow.com/questions/6592468/why-is-it-frowned-upon-to-use- a-null-layout-in-swing)以獲得更多信息 – MadProgrammer

+1

[作爲在彈出菜單中使用'Action'的示例](http://stackoverflow.com/questions/22622973/jtable-copy-and-paste-using -clipboard-and-abstract action/22623240#22623240) – MadProgrammer

回答

0

建設MyItemActionListener類實現ActionListener接口。給MyItemActionListener一個專用字段myPopupManager。使用適當的構造函數構造監聽器時,將彈出式管理器傳遞到該字段。在你的菜單項中實現一個觸發動作的方法,作爲一個獲取行號的方法。應該看起來像

class MyItemActionListener implements ActionListener { 
private PopupManager myPopupManager; 

MyItemActionListener(PopupManager myPopupManager) { 
    this.myPopupManager = myPopupManager; 
} 

@Override 
void actionPerformed(ActionEvent e) { 
    ((MyMenuItem) e.getSource()).doSomething(myPopupManager.getRow()); 
} 

} 

將偵聽器添加到您的彈出菜單項。這應該能夠完成這項工作。

+0

'PopupManager'? – MadProgrammer

0

有很多方法可以做到這一點,你可以創建一個自定義ActionListener,它參考了JTable,這是好的,它有點混亂和繁瑣的重用,但它可以工作。

另一個解決辦法是利用[Action API]的(How to Use Actions),其竣工圖上ActionListener的概念,並提供了自包含的特性使它更可重複使用的 - 你可以在菜單,按鈕和鍵綁定使用,而不需要重新實現功能。

我想通過定義一個「基地」錶行動開始......

public abstract class AbstractTableAction<TM extends TableModel> extends AbstractAction { 

    private JTable table; 
    private TM model; 

    public AbstractTableAction(JTable table, TM model) { 
     this.table = table; 
     this.model = model; 
    } 

    public TM getModel() { 
     return model; 
    } 

    public JTable getTable() { 
     return table; 
    } 

    public int getSelectedRow() { 
     return getTable().getSelectedRow(); 
    } 

    public int getSelectedColumn() { 
     return getTable().getSelectedColumn(); 
    } 
} 

沒什麼特別的,它有一個JTable和一些輔助方法提供了參照。

現在你只需要定義要對錶執行的操作...

public class AddRowAction extends AbstractTableAction<DefaultTableModel> { 

    public AddRowAction(JTable table, DefaultTableModel model) { 
     super(table, model); 
     putValue(NAME, "Add"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Add @ " + getSelectedRow() + "x" + getSelectedColumn()); 
    } 

} 

public class DeleteRowAction extends AbstractTableAction<DefaultTableModel> { 

    public DeleteRowAction(JTable table, DefaultTableModel model) { 
     super(table, model); 
     putValue(NAME, "Delete"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Delete @ " + getSelectedRow() + "x" + getSelectedColumn()); 
    } 

} 

public class EditRowAction extends AbstractTableAction<DefaultTableModel> { 

    public EditRowAction(JTable table, DefaultTableModel model) { 
     super(table, model); 
     putValue(NAME, "Edit"); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     System.out.println("Edit @ " + getSelectedRow() + "x" + getSelectedColumn()); 
    } 

} 

一旦你得到了所有的排序,你只是建立在彈出菜單中...

JPopupMenu popupMenu = new JPopupMenu(); 
popupMenu.add(new AddRowAction(table, dtm)); 
popupMenu.add(new EditRowAction(table, dtm)); 
popupMenu.add(new DeleteRowAction(table, dtm)); 

現在,你需要某種方式來顯示彈出菜單,我更喜歡使用JComponent#setComponentPopupMenu,但這並不選擇表,這是可悲的行/列:(所以我們需要把它自己

public class MousePopupHandler extends MouseAdapter { 

    private JTable table; 
    private JPopupMenu popupMenu; 

    public MousePopupHandler(JTable table, JPopupMenu popupMenu) { 
     this.table = table; 
     this.popupMenu = popupMenu; 
    } 

    @Override 
    public void mousePressed(MouseEvent e) { 
     doPopup(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
     doPopup(e); 
    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 
     doPopup(e); 
    } 

    protected void doPopup(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      int x = e.getPoint().x; 
      int y = e.getPoint().y; 
      int row = table.rowAtPoint(e.getPoint()); 
      int col = table.columnAtPoint(e.getPoint()); 
      table.setRowSelectionInterval(row, row); 
      table.setColumnSelectionInterval(col, col); 
      popupMenu.show(table, x, y); 
     } 
    } 

} 

所以,基本上,這可確保行/列被點擊時顯示之前彈出菜單

這就是所有你需要的,剛絲它一起,你就會知道能夠選擇在觸發時確定動作的上下文

import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import javax.swing.AbstractAction; 
import static javax.swing.Action.NAME; 
import javax.swing.JFrame; 
import javax.swing.JPopupMenu; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    public Test() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 
       DefaultTableModel dtm = new DefaultTableModel(0, 0); 
       // add header of the table 
       String header[] = new String[]{"Id", "Descrizione", "Stato", "Data inizio", "Tipo", "Responsabile"}; 
       // add header in table model  
       dtm.setColumnIdentifiers(header); 
       //set model into the table object 

       // add row dynamically into the table 
       // for now only dummy data 
       for (int count = 1; count <= 3; count++) { 
        dtm.addRow(new Object[]{Integer.toString(count), "data", "data", 
                    "data", "data", "data"}); 
       } 

       JTable table = new JTable(dtm); 

       JPopupMenu popupMenu = new JPopupMenu(); 
       popupMenu.add(new AddRowAction(table, dtm)); 
       popupMenu.add(new EditRowAction(table, dtm)); 
       popupMenu.add(new DeleteRowAction(table, dtm)); 

       table.addMouseListener(new MousePopupHandler(table, popupMenu)); 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.add(new JScrollPane(table)); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class MousePopupHandler extends MouseAdapter { 

     private JTable table; 
     private JPopupMenu popupMenu; 

     public MousePopupHandler(JTable table, JPopupMenu popupMenu) { 
      this.table = table; 
      this.popupMenu = popupMenu; 
     } 

     @Override 
     public void mousePressed(MouseEvent e) { 
      doPopup(e); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
      doPopup(e); 
     } 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      doPopup(e); 
     } 

     protected void doPopup(MouseEvent e) { 
      if (e.isPopupTrigger()) { 
       int x = e.getPoint().x; 
       int y = e.getPoint().y; 
       int row = table.rowAtPoint(e.getPoint()); 
       int col = table.columnAtPoint(e.getPoint()); 
       table.setRowSelectionInterval(row, row); 
       table.setColumnSelectionInterval(col, col); 
       popupMenu.show(table, x, y); 
      } 
     } 

    } 

    public abstract class AbstractTableAction<TM extends TableModel> extends AbstractAction { 

     private JTable table; 
     private TM model; 

     public AbstractTableAction(JTable table, TM model) { 
      this.table = table; 
      this.model = model; 
     } 

     public TM getModel() { 
      return model; 
     } 

     public JTable getTable() { 
      return table; 
     } 

     public int getSelectedRow() { 
      return getTable().getSelectedRow(); 
     } 

     public int getSelectedColumn() { 
      return getTable().getSelectedColumn(); 
     } 
    } 

    public class AddRowAction extends AbstractTableAction<DefaultTableModel> { 

     public AddRowAction(JTable table, DefaultTableModel model) { 
      super(table, model); 
      putValue(NAME, "Add"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Add @ " + getSelectedRow() + "x" + getSelectedColumn()); 
     } 

    } 

    public class DeleteRowAction extends AbstractTableAction<DefaultTableModel> { 

     public DeleteRowAction(JTable table, DefaultTableModel model) { 
      super(table, model); 
      putValue(NAME, "Delete"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Delete @ " + getSelectedRow() + "x" + getSelectedColumn()); 
     } 

    } 

    public class EditRowAction extends AbstractTableAction<DefaultTableModel> { 

     public EditRowAction(JTable table, DefaultTableModel model) { 
      super(table, model); 
      putValue(NAME, "Edit"); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      System.out.println("Edit @ " + getSelectedRow() + "x" + getSelectedColumn()); 
     } 

    } 
} 
相關問題