我有一个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));
}
});
}
}
看看[如何使用动作](http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html) ,基本上我会创建一个或多个具有对表格的引用并知道触发时该做什么的操作。我还会考虑看一看'JComponent#setComponentPopupMenu',它将允许它控制并确定何时显示弹出框 – MadProgrammer
避免使用'null'布局,像素完美的布局是现代UI设计中的一种幻想。影响组件的个体大小的因素太多,其中没有一个可以控制。Swing旨在与布局经理一起工作,放弃这些将导致无法结束的问题和问题,您将花费越来越多的时间来尝试纠正。您可能想看看[为什么在SWING中使用空布局不满?](http://stackoverflow.com/questions/6592468/why-is-it-frowned-upon-to-use- a-null-layout-in-swing)以获得更多信息 – MadProgrammer
[作为在弹出菜单中使用'Action'的示例](http://stackoverflow.com/questions/22622973/jtable-copy-and-paste-using -clipboard-and-abstract action/22623240#22623240) – MadProgrammer