Problem:
Mouse Listener not getting fired.
Description:
I have a data in JTable where there is one column of date time and it is in the following format "Mon Aug 04 17:59:45 IST 2008". I want to sort the data in the JTable but using the default sorter is not working for me as it is a string based sorter which I do not for the data time column. Hence I am trying to add a mouse listener to the table row header. But when I am clicking the header the mouse click event is not getting fired. I am at a loss as to why this is happening. The code is too big to be uploaded on the forum as it contains 4 class. If need please give me your mail Id will send the code to you.
Here is the code which I have shorted.
Class TableMan.java (The main class to evoke the table)
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
public class TableMan {
private TableUI _tableUI = null;
public TableMan() {
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
TableMan obj = new TableMan();
obj.createAndDisplayUI();
}
public void createAndDisplayUI(){
TableUI tableUI = new TableUI();
_tableUI = tableUI;
ActionListener action = this.getActionListener();
tableUI.createAndDisplayTableUI();
JButton cancelButton = _tableUI.getCancelButton();
cancelButton.addActionListener(action);
}
private ActionListener getActionListener() {
return new ActionListener() {
public void actionPerformed(ActionEvent e) {
_tableUI.setCursor(new Cursor(Cursor.WAIT_CURSOR));
try {
if(e.getActionCommand().equals("Cancel")) {
_tableUI.removeAll();
_tableUI.dispose();
_tableUI = null;
}
}catch (Exception exception){
}finally{
if(_tableUI != null){
_tableUI.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
}
};
}
}
Class TableTableModel.java
import java.awt.event.ItemListener;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.table.*;
class TableTableModel extends AbstractTableModel {
private Object[] _columns;
private Object[][] _cellData;
private TableUI _tableUI;
public TableTableModel(Object[] columns, Object[][] data, TableUI tableUI){
_columns = columns;
_cellData = data;
_tableUI = tableUI;
}
public int getColumnCount() {
return _columns.length;
}
public Class<?> getColumnClass(int columnIndex) {
return _cellData[0][columnIndex].getClass();
}
public int getRowCount() {
return _cellData.length;
}
public Object getValueAt (int rowIndex, int columnIndex){
return _cellData[rowIndex][columnIndex];
}
@Override
public String getColumnName(int column) {
return _columns[column].toString();
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return (columnIndex == 0);
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
_cellData[rowIndex][columnIndex] = aValue;
fireTableCellUpdated(rowIndex, columnIndex);
_tableUI.setNSelectedRows((Boolean)aValue);
}
}
Class Table.java
import javax.swing.*;
import javax.swing.table.*;
public class Table extends JTable {
public Table(AbstractTableModel model){
super(model);
TableColumnModel tableModel = this.getColumnModel();
if (model.getColumnCount() == 3) {
tableModel.getColumn(0).setPreferredWidth(15);
tableModel.getColumn(1).setPreferredWidth(200);
tableModel.getColumn(2).setPreferredWidth(200);
}
this.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.setBounds(10, 10, 400, 180);
this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
}
}
Main UI Class TableUI.java
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class TableUI extends JFrame {
private Object[] columnHeaders = { "", "Date Time", "Result"};
private Table rowheadertable = null;
private Table datatable = null;
private JButton cancel = null;
private int _nSelectedRows;
private Object[][] inputs = {
{"Mon Aug 04 17:59:45 IST 2008","UNKNOWN"},
{"Mon Jul 28 15:38:27 IST 2008","UNKNOWN"},
{"Thu Aug 28 13:06:48 IST 2008","FAILED"},
{"Thu Aug 28 13:07:33 IST 2008","PASSED"},
{"Thu Jul 31 15:17:01 IST 2008","UNKNOWN"},
{"Tue Jul 22 15:21:21 IST 2008","UNKNOWN"},
{"Tue Jul 22 15:21:41 IST 2008","UNKNOWN"}
};
public TableUI() {
Dimension maxSize = new Dimension(570,300);
this.setMinimumSize(maxSize);
this.setMaximumSize(maxSize);
this.setSize(maxSize);
this.setResizable(false);
}
public void createAndDisplayTableUI(){
this.setAlwaysOnTop(true);
JPanel tablePanel = new JPanel();
tablePanel.setBounds(10, 10, 545, 180);
tablePanel.setLayout(new BorderLayout());
Object[][] _rowData = new Object[inputs.length][columnHeaders.length];
for (int i = 0; i < inputs.length;i++){
_rowData[0] = false;
this.setTitle("Checking");
_rowData[i][1] = inputs[i][0];
_rowData[i][2] = inputs[i][1];
}
TableTableModel model = new TableTableModel(columnHeaders,_rowData, this);
rowheadertable = new Table(model);
datatable = new Table(model);
// datatable.setAutoCreateRowSorter(true);
TableColumnModel columnModel = rowheadertable.getColumnModel();
TableColumn selectColumn = columnModel.getColumn(0);
selectColumn.setCellEditor(new DefaultCellEditor(new JCheckBox()));
while (rowheadertable.getColumnCount() > 1){
columnModel.removeColumn(columnModel.getColumn(1));
}
TableColumnModel dataColumnModel = datatable.getColumnModel();
dataColumnModel.removeColumn(dataColumnModel.getColumn(dataColumnModel.getColumnIndex("")));
DefaultTableCellRenderer cellrenderer = new DefaultTableCellRenderer();
cellrenderer.setHorizontalAlignment(JLabel.CENTER);
dataColumnModel.getColumn(dataColumnModel.getColumnIndex("Result")).setCellRenderer(cellrenderer);
JScrollPane pane = new JScrollPane();
tablePanel.add(pane,BorderLayout.CENTER);
rowheadertable.getTableHeader().setReorderingAllowed(false);
selectColumn.setPreferredWidth(15);
selectColumn.setResizable(false);
rowheadertable.setPreferredScrollableViewportSize(rowheadertable.getPreferredSize());
rowheadertable.addMouseListener(this.getColumnListener());
pane.setCorner(JScrollPane.UPPER_LEFT_CORNER, rowheadertable.getTableHeader());
pane.setRowHeaderView(rowheadertable);
JViewport port = new JViewport();
port.setView(datatable);
pane.setViewport(port);
this.getContentPane().add(tablePanel);
JPanel otherPanel = new JPanel();
otherPanel.setBounds(0, 200, 400, 100);
otherPanel.setLayout(null);
cancel = new JButton("Cancel");
cancel.setActionCommand("Cancel");
cancel.setBounds(472, 230, 80, 20);
cancel.setMnemonic(KeyEvent.VK_C);
otherPanel.add(cancel);
this.getContentPane().add(otherPanel);
this.setVisible(true);
}
private MouseAdapter getColumnListener() {
return new MouseAdapter(){
protected Vector tableData;
@Override
public void mouseClicked(MouseEvent e){
JTable t = (JTable)e.getSource();
TableColumnModel colModel = t.getColumnModel();
int columnModelIndex = colModel.getColumnIndexAtX(e.getX());
int modelIndex = colModel.getColumn(columnModelIndex).getModelIndex();
int sortCol = 0;
boolean sortAsc = true;
if (modelIndex < 0)
return;
if (sortCol == modelIndex)
sortAsc = !sortAsc;
else
sortCol = modelIndex;
for (int i = 0 ; i < rowheadertable.getColumnCount(); i++){
TableColumn column = colModel.getColumn(i);
column.setHeaderValue(rowheadertable.getColumnName(column.getModelIndex()));
}
t.getTableHeader().repaint();
for (int i = 0; i < t.getRowCount(); i++){
Object[] _rowData = new Object[columnHeaders.length];
for (int j = 0; j < columnHeaders.length; j ++){
_rowData[j] = t.getValueAt(i, j);
}
tableData.addElement(new TableData(_rowData[0].toString(),
rowData[1].toString(),rowData[2].toString(),
rowData[3].toString(),rowData[4].toString(),
_rowData[5].toString()));
}
Collections.sort(tableData, new tableComparator(modelIndex, sortAsc));
t.tableChanged(new TableModelEvent(t.getModel()));
t.repaint();
}
};
}
class TableData {
public String _checkBox;
public String _timeStamp;
public String _ruleName;
public String _evalID;
public String _status;
public String _fileName;
private TableData(String checkBox, String timeStamp, String ruleName,
String evalID, String status, String fileName) {
_checkBox = checkBox;
_timeStamp = timeStamp;
_ruleName = ruleName;
_evalID = evalID;
_status = status;
_fileName = fileName;
}
}
class tableComparator implements Comparator {
protected int _sortCol;
protected boolean _sortAsc;
public tableComparator(int sortCol, boolean sortAsc){
_sortCol = sortCol;
_sortAsc = sortAsc;
}
public int compare (Object o1, Object o2){
if(!(o1 instanceof String)|| !(o2 instanceof String))
return 0;
int result = 0;
switch (_sortCol){
case 0:
break;
case 1:
String timestamp1 = o1.toString();
String timestamp2 = o2.toString();
String tmpStore = null;
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM d HH:mm:ss z yyyy");
Date date1 = null;
Date date2 = null;
try {
date1 = sdf.parse(timestamp1);
date2 = sdf.parse(timestamp2);
} catch (Exception ParseException){
JOptionPane.showMessageDialog(new JFrame(),
"Problem in converting the date",
"Date convertion problem.", JOptionPane.ERROR_MESSAGE);
}
if (date1.compareTo(date2) > 0){
tmpStore = timestamp1;
timestamp1 = timestamp2;
timestamp2 = tmpStore;
}
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
}
if (!_sortAsc)
result = -result;
return result;
}
}
/**
* Returns the selected rows in a table
*
* @return selected rows
*/
public void setNSelectedRows(boolean isSelected) {
if(isSelected) {
_nSelectedRows += 1;
} else {
_nSelectedRows -= 1;
}
}
public JButton getCancelButton() {
return cancel;
}
}
Edited by: Natraj_Kadur on Sep 15, 2008 11:38 AM