[swing] JTable怎么给选中行添加监听器

leajon_first 2012-11-19 04:14:40
[swing]需要实现的效果是这样的:当右键单击被选中行时会有个JPopupMenu弹出。右键单击没有选中的行不会弹出。。
监听双击的demo在二楼,谁帮我改改,非常感谢!
...全文
1054 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
leajon_first 2012-11-20
  • 打赏
  • 举报
回复
引用 4 楼 baobao28 的回复:
帮你改了一下,应该是你要的效果了 Java code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980import j……
很接近了,看来我还是API不熟。最后效果
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class JTableDemo extends JFrame {

	private static final long serialVersionUID = 1L;
	private JTable tbl;
	private DefaultTableModel tm;
	private JPopupMenu[] pms = new JPopupMenu[2];

	public JTableDemo() {
		String[][] data = {{"R1C1", "R1C2"}, {"R2C1", "R2C2"}};
		String[] title = {"Column1", "Column2"};
		tm = new DefaultTableModel(data, title) {
			private static final long serialVersionUID = 1L;

			@Override
			public boolean isCellEditable(int row, int column) {
				return false;
			}
		};
		tbl = new JTable(tm);
		tbl.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tbl.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if (e.getButton() == MouseEvent.BUTTON3) {
					if (tbl.rowAtPoint(e.getPoint()) == tbl.getSelectedRow()) {
						pms[tbl.getSelectedRow()].show(tbl, e.getX(), e.getY());
					}
				}
			}
		});

		JScrollPane jsp = new JScrollPane();
		jsp.setViewportView(tbl);

		JPanel pan = new JPanel();
		pan.setOpaque(true);
		this.setContentPane(pan);
		pan.setLayout(new BorderLayout());
		pan.add(jsp, BorderLayout.CENTER);

		JPopupMenu pm = new JPopupMenu();
		pm.add(new JMenuItem("Row1"));
		pms[0] = pm;
		pm = new JPopupMenu();
		pm.add(new JMenuItem("Row2"));
		pms[1] = pm;
	}

	private static void createAndShowGui() {
		JTableDemo td = new JTableDemo();
		td.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		td.setMinimumSize(new Dimension(500, 400));
		td.setLocationRelativeTo(null);
		td.setVisible(true);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				createAndShowGui();
			}
		});
	}
}
shewen45 2012-11-20
  • 打赏
  • 举报
回复
楼上已经给答案了 我来蹭分
baobao28 2012-11-20
  • 打赏
  • 举报
回复
帮你改了一下,应该是你要的效果了

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class JTableDemo extends JFrame {
	private static final long serialVersionUID = 1L;
	private JTable tbl;
	private DefaultTableModel tm;
	private JPopupMenu[] pms = new JPopupMenu[2];

	public JTableDemo() {
		String[][] data = { { "R1C1", "R1C2" }, { "R2C1", "R2C2" } };
		String[] title = { "Column1", "Column2" };
		tm = new DefaultTableModel(data, title) {
			private static final long serialVersionUID = 1L;

			@Override
			public boolean isCellEditable(int row, int column) {
				return false;
			}
		};
		tbl = new JTable(tm);
		tbl.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				int sr;
//				if ((sr = tbl.getSelectedRow()) == -1) {
//					return;
//				}
				if (e.getButton() == MouseEvent.BUTTON3) {
					pms[tbl.rowAtPoint(e.getPoint())].show(tbl, e.getX(), e.getY());
				}
			}
		});

		JScrollPane jsp = new JScrollPane();
		jsp.setViewportView(tbl);

		JPanel pan = new JPanel();
		pan.setOpaque(true);
		this.setContentPane(pan);
		pan.setLayout(new BorderLayout());
		pan.add(jsp, BorderLayout.CENTER);

		JPopupMenu pm = new JPopupMenu();
		pm.add(new JMenuItem("Row1"));
		pms[0] = pm;
		pm = new JPopupMenu();
		pm.add(new JMenuItem("Row2"));
		pms[1] = pm;
	}

	private static void createAndShowGui() {
		JTableDemo td = new JTableDemo();
		td.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		td.setMinimumSize(new Dimension(500, 400));
		td.setLocationRelativeTo(null);
		td.setVisible(true);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				createAndShowGui();
			}
		});
	}
}
leajon_first 2012-11-20
  • 打赏
  • 举报
回复
引用 2 楼 WanGuFengYue 的回复:
tbl.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { int sr; if ((sr = tbl.getSelectedRow()) == -1) { return; } if (e.getButton() == MouseE……
你没理解问题,用你的监听器选中第一行然后在第二行右击会弹出第一行的弹出菜单! 我需要的是在选中的行上右击才有弹窗
WanGuFengYue 2012-11-19
  • 打赏
  • 举报
回复
tbl.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { int sr; if ((sr = tbl.getSelectedRow()) == -1) { return; } if (e.getButton() == MouseEvent.BUTTON3 &&(e.getClickCount() == 1)) { pms[sr].show(tbl, e.getX(), e.getY()); } } }); 将监听器改下就行,MouseEvent.BUTTON1代表左键,MouseEvent.BUTTON2代表中键,MouseEvent.BUTTON3 代表右键
leajon_first 2012-11-19
  • 打赏
  • 举报
回复
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;



public class JTableDemo extends JFrame{
	private JTable tbl;
	private DefaultTableModel tm;
	private JPopupMenu[] pms = new JPopupMenu[2];
	public JTableDemo() {
		String[][] data = { {"R1C1", "R1C2"}, {"R2C1", "R2C2"} };
		String[] title = {"Column1", "Column2"};
		tm = new DefaultTableModel(data, title){
			@Override
			public boolean isCellEditable(int row, int column){
				return false;
			}
		};
		tbl = new JTable(tm);
		tbl.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				int sr;
				if ((sr = tbl.getSelectedRow()) == -1) {
					return;
				}
				if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) {
							pms[sr].show(tbl, e.getX(), e.getY());
				}
			}
		});

		JScrollPane jsp = new JScrollPane();
		jsp.setViewportView(tbl);

		JPanel pan = new JPanel();
		pan.setOpaque(true);
		this.setContentPane(pan);
		pan.setLayout(new BorderLayout());
		pan.add(jsp, BorderLayout.CENTER);

		JPopupMenu pm = new JPopupMenu();
		pm.add(new JMenuItem("Row1"));
		pms[0] = pm;
		pm = new JPopupMenu();
		pm.add(new JMenuItem("Row2"));
		pms[1] = pm;
	}

	private static void createAndShowGui() {
		JTableDemo td = new JTableDemo();
		td.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		td.setMinimumSize(new Dimension(500, 400));
		td.setLocationRelativeTo(null);
		td.setVisible(true);
	}
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				createAndShowGui();
			}
		});
	}
}

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧