首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

[swing] JTable如何给选中行添加监听器

2012-12-14 
[swing] JTable怎么给选中行添加监听器本帖最后由 leajon_first 于 2012-11-19 17:10:47 编辑[swing]需要

[swing] JTable怎么给选中行添加监听器
本帖最后由 leajon_first 于 2012-11-19 17:10:47 编辑 [swing]需要实现的效果是这样的:当右键单击被选中行时会有个JPopupMenu弹出。右键单击没有选中的行不会弹出。。
监听双击的demo在二楼,谁帮我改改,非常感谢!
[最优解释]
帮你改了一下,应该是你要的效果了


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();
}
});
}
}

[其他解释]
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();
}
});
}
}


[其他解释]
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
代表右键

[其他解释]
引用:
tbl.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int sr;
if ((sr = tbl.getSelectedRow()) == -1) {
return;
}
if (e.getButton() == MouseE……

你没理解问题,用你的监听器选中第一行然后在第二行右击会弹出第一行的弹出菜单!
我需要的是在选中的行上右击才有弹窗
[其他解释]
 楼上已经给答案了 我来蹭分 
[其他解释]
引用:
帮你改了一下,应该是你要的效果了


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();
}
});
}
}

热点排行