2017-02-24 83 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()); 
     } 

    } 
} 
相关问题