现在要实现的功能是点击表头,将对应列选中,然后将对应的数据列形式的数据copy进来。
例如数据格式是
dateTime
Integer
String
integer
DateTime
String
integer
这样的一列
下面是事例代码,其实这也是<<JFC core Foundation>>一个范例的改编
//因为JTable默认的是行选择,如果要列实现列选择,必须改变选中模式
注意代码,我们最终要
//只会选中单元格
else if (mode.equals("cell"))
{
tbl.setRowSelectionAllowed(false);
tbl.setColumnSelectionAllowed(false);
tbl.setCellSelect当前ionEnabled(true);
}
在这段代码下运行
因为我们的最终需求是不仅点击表头选中对应列,同时在点击单元格的时候还是要选中对应行
可是通过配置JTable的选中模式是不能实现这个目标,大家可以看看
else if (mode.equals("row-cloumn-cell"))
{
tbl.setRowSelectionAllowed(true);
tbl.setColumnSelectionAllowed(true);
tbl.setCellSelectionEnabled(true);
}
这种模式下的表格效果,肯定与你想的 不一样,我是觉得JTable这些选中模式的逻辑有些混乱
所以我的实现是,首先只让选中单元格,然后分别设置JTableHeader和JTable时的鼠标事件
即点击表头选中对应列,点击表必然落在某一行的单元格,其实有可能落到单元格之间的那个空隙上,
但是总而言之是要选中当前行
本人在实际项目中运行的时候遇到一个 问题,本来JTable默认是鼠标单击选中,双击编辑
但是我们实际的表格却是在鼠标单击时就开始编辑,所以这时根本不会出发触发注册在JTable上的鼠标监听器
即
//点击表 选中对应行
public void addTableListener()
{
tbl.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
doMouseClickTableAction(e);
}
});
}
中的 public void mouseClicked(MouseEvent e)
{
doMouseClickTableAction(e);
}
根本不会执行
那么如何将表格置为单击选中呢??
这时必须修改表格编辑器的
@Override
public boolean isCellEditable(EventObject e)
{
if (e instanceof MouseEvent)
{
return ((MouseEvent) e).getClickCount() >= clickCountToStart;
}
return true;
}
即让鼠标点击数>2的时候才开始编辑
具体copy和paste使用TableCopyAction和TablePasteAction
这两个类也来自<<JFC core Foundation>>具体的拷贝copy和paste 就参考他们
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class CopyPasteExample extends JFrame
{
JTable tbl = new JTable(new DefaultTableModel(data, names));
public CopyPasteExample(String title, String mode)
{
super(title);
tbl.setPreferredScrollableViewportSize(tbl.getPreferredSize());
this.getContentPane().add(new JScrollPane(tbl));
// Set up the selection mode
tbl.setCellSelectionEnabled(false);
//只会选中行
if (mode.equals("row"))
{
tbl.setRowSelectionAllowed(true);
tbl.setColumnSelectionAllowed(false);
tbl.setCellSelectionEnabled(false);
}
//只会选中列
else if (mode.equals("column"))
{
tbl.setRowSelectionAllowed(false);
tbl.setColumnSelectionAllowed(true);
tbl.setCellSelectionEnabled(false);
}
//只会选中单元格
else if (mode.equals("cell"))
{
tbl.setRowSelectionAllowed(false);
tbl.setColumnSelectionAllowed(false);
tbl.setCellSelectionEnabled(true);
}
else if (mode.equals("row-cloumn"))
{
tbl.setRowSelectionAllowed(true);
tbl.setColumnSelectionAllowed(true);
}
else if (mode.equals("row-cloumn-cell"))
{
tbl.setRowSelectionAllowed(true);
tbl.setColumnSelectionAllowed(true);
tbl.setCellSelectionEnabled(true);
}
addTableHeaderListener();
// addTableListener();
tbl.registerKeyboardAction(new TableCopyAction(),
KeyStroke.getKeyStroke("ctrl C"), JComponent.WHEN_FOCUSED);
tbl.registerKeyboardAction(new TablePasteAction(),
KeyStroke.getKeyStroke("ctrl V"), JComponent.WHEN_FOCUSED);
}
public static void main(String[] args)
{
JFrame f = new CopyPasteExample("Cell", "cell");
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f1 = new CopyPasteExample("Column", "column");
f1.pack();
f1.setVisible(true);
f1.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f1.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f2 = new CopyPasteExample("Row", "row");
f2.pack();
f2.setVisible(true);
f2.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f2.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f3 = new CopyPasteExample("Row-Column", "row-column");
f3.pack();
f3.setVisible(true);
f3.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f3.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f4 = new CopyPasteExample("Row-Cloumn-Cell", "row-cloumn-cell");
f4.pack();
f4.setVisible(true);
f4.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f4.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
// Table data
private static final String[][] data = new String[][] {
{ "1", "2", "3", "4", "5" }, { "10", "20", "30", "40", "50" },
{ "100", "200", "300", "400", "500" },
{ "1000", "2000", "3000", "4000", "5000" } };
private static final String[] names = { "A", "B", "C", "D", "E" };
//点击表头选中对应列
public void addTableHeaderListener()
{
JTableHeader tableHeader = tbl.getTableHeader();
tableHeader.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
doMouseClickTableHeaderAction(e);
}
});
}
//点击表 选中对应行
public void addTableListener()
{
tbl.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
doMouseClickTableAction(e);
}
});
}
public void doMouseClickTableAction(MouseEvent e)
{
//实现当前行的选中,请注意方式,是将所有列选中
//因为当前是选中一个单元格,语言很难描述,大家可以根据运行结果去判断,和思考这其中的逻辑
tbl.setColumnSelectionInterval(0, tbl.getColumnCount() - 1);
}
public void doMouseClickTableHeaderAction(MouseEvent e)
{
JTableHeader tableHeader = tbl.getTableHeader();
//获取当前列
int columnIndex = tableHeader.columnAtPoint(e.getPoint());
//选中当前列
tbl.setRowSelectionInterval(0, tbl.getRowCount() - 1);
tbl.setColumnSelectionInterval(columnIndex, columnIndex);
//因为有时候表不一定能获取焦点,这时如果进行拷贝是没有响应的
//tbl.requestFocus();
}
}
import java.awt.*;
import java.util.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import javax.swing.*;
public class TablePasteAction extends AbstractAction {
protected JTable target;
public TablePasteAction() {
}
public TablePasteAction(JTable tbl) {
setTarget(tbl);
}
public void setTarget(JTable tbl) {
target = tbl;
}
public JTable getTarget() {
return target;
}
public void actionPerformed(ActionEvent evt) {
JTable tbl = target;
if (tbl == null) {
tbl = (JTable)evt.getSource();
}
Transferable t =
tbl.getToolkit().getSystemClipboard().getContents(null);
if (t == null) {
// No usable content
return;
}
try {
String sel = (String)t.getTransferData(DataFlavor.stringFlavor);
// Break the selection into rows and then into columns.
StringTokenizer rowTokenizer = new StringTokenizer(sel, "/n");
int rowCount = rowTokenizer.countTokens();
String[][] data = new String[rowCount][];
// One pass of this loop for each row
for (int i = 0; i < rowCount; i++) {
String row = rowTokenizer.nextToken();
StringTokenizer colTokenizer = new StringTokenizer(row, "/t");
int colCount = colTokenizer.countTokens();
String[] cols = new String[colCount];
data[i] = cols;
// One pass of this loop for each column
for (int j = 0; j < colCount; j++) {
cols[j] = colTokenizer.nextToken();
}
}
// Install the data in the table
applySelection(tbl, data);
} catch (Exception ex) {
// Happens when clipboard content is not a string
}
}
// Handles the entire selection as a two-dimensional array.
// Subclasses may override this to provide custom processing.
protected void applySelection(JTable tbl, String[][] data) {
int row = tbl.getSelectedRow();
int col = tbl.getSelectedColumn();
int selRows = tbl.getSelectedRowCount();
int selCols = tbl.getSelectedColumnCount();
int dataRows = data.length;
int dataCols = (dataRows > 0 ? data[0].length : 0);
// If only one cell is selected, allow the paste
// to operate on the part of the table at and
// below and to the right of that cell. Otherwise,
// bound the paste to the selected area
if (selRows == 1 && selCols == 1) {
selRows = tbl.getRowCount() - row;
selCols = tbl.getColumnCount() - col;
}
// Limit the paste operation to the selection,
// or to the table, whichever is the smaller.
if (dataRows > selRows) {
dataRows = selRows;
}
if (dataCols > selCols) {
dataCols = selCols;
}
// Apply each item in turn
for (int i = 0; i < dataRows; i++) {
for (int j = 0; j < dataCols; j++) {
setValueAt(tbl, row + i, col + j, data[i][j]);
}
}
}
// Sets the value for a given row and column.
// Subclasses may override this to carry out the
// appropriate conversions for specific TableModels.
protected void setValueAt(JTable tbl, int row, int column, String value) {
tbl.setValueAt(value, row, column);
}
}
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class CopyPasteExample extends JFrame
{
JTable tbl = new JTable(new DefaultTableModel(data, names));
public CopyPasteExample(String title, String mode)
{
super(title);
tbl.setPreferredScrollableViewportSize(tbl.getPreferredSize());
this.getContentPane().add(new JScrollPane(tbl));
// Set up the selection mode
tbl.setCellSelectionEnabled(false);
if (mode.equals("row"))
{
tbl.setRowSelectionAllowed(true);
tbl.setColumnSelectionAllowed(false);
}
else if (mode.equals("column"))
{
tbl.setRowSelectionAllowed(false);
tbl.setColumnSelectionAllowed(true);
}
else if (mode.equals("cell"))
{
tbl.setRowSelectionAllowed(false);
tbl.setColumnSelectionAllowed(false);
tbl.setCellSelectionEnabled(true);
}
else if (mode.equals("row-cloumn"))
{
tbl.setRowSelectionAllowed(true);
tbl.setColumnSelectionAllowed(true);
}
else if (mode.equals("row-cloumn-cell"))
{
tbl.setRowSelectionAllowed(true);
tbl.setColumnSelectionAllowed(true);
tbl.setCellSelectionEnabled(true);
}
addTableHeaderListener();
// addTableListener();
tbl.registerKeyboardAction(new TableCopyAction(),
KeyStroke.getKeyStroke("ctrl C"), JComponent.WHEN_FOCUSED);
tbl.registerKeyboardAction(new TablePasteAction(),
KeyStroke.getKeyStroke("ctrl V"), JComponent.WHEN_FOCUSED);
}
public static void main(String[] args)
{
JFrame f = new CopyPasteExample("Cell", "cell");
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f1 = new CopyPasteExample("Column", "column");
f1.pack();
f1.setVisible(true);
f1.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f1.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f2 = new CopyPasteExample("Row", "row");
f2.pack();
f2.setVisible(true);
f2.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f2.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f3 = new CopyPasteExample("Row-Column", "row-column");
f3.pack();
f3.setVisible(true);
f3.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f3.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
JFrame f4 = new CopyPasteExample("Row-Cloumn-Cell", "row-cloumn-cell");
f4.pack();
f4.setVisible(true);
f4.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
f4.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
System.exit(0);
}
});
}
// Table data
private static final String[][] data = new String[][] {
{ "1", "2", "3", "4", "5" }, { "10", "20", "30", "40", "50" },
{ "100", "200", "300", "400", "500" },
{ "1000", "2000", "3000", "4000", "5000" } };
private static final String[] names = { "A", "B", "C", "D", "E" };
public void addTableHeaderListener()
{
JTableHeader tableHeader = tbl.getTableHeader();
tableHeader.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
doMouseClickTableHeaderAction(e);
}
});
}
public void addTableListener()
{
tbl.addMouseListener(new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
doMouseClickTableAction(e);
}
});
}
public void doMouseClickTableAction(MouseEvent e)
{
// tbl.setRowSelectionAllowed(true);
// tbl.setColumnSelectionAllowed(true);
tbl.setColumnSelectionInterval(0, tbl.getColumnCount() - 1);
// tbl.getSelectedRow();
// tbl.getSelectionModel().setSelectionInterval(
// tbl.getSelectedRow(), tbl.getSelectedRow());
}
public void doMouseClickTableHeaderAction(MouseEvent e)
{
JTableHeader tableHeader = tbl.getTableHeader();
int columnIndex = tableHeader.columnAtPoint(e.getPoint());
tbl.setRowSelectionInterval(0, tbl.getRowCount() - 1);
tbl.setColumnSelectionInterval(columnIndex, columnIndex);
//tbl.requestFocus();
}
}