hi all java gurus
i am havin a JTable with Header being shown as CheckBox
i have used some sample code found at
<href>http://www.codeguru.com/java/articles/664.shtml</href>
everythings working fine except the header is not being displayed as a standard
Jtable Header Column(Beveled look).i tried some changes(check the code below) but not getting it work that way.
u can see it on the web page how it looks and also i am pasting the code
any help will be appreciated
import java.awt.event.ItemListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.ImageIcon;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
/**
* Add a JCheckBox to the Renderer
* @author Jan-Friedrich Mutter (jmutter@bigfoot.de)
*/
public class CheckBoxHeader extends JCheckBox
implements TableCellRenderer, MouseListener {
/**
* the Renderer Component.
* @see #getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
*/
protected CheckBoxHeader rendererComponent;
/** To which (JTable-) columns does this Checkbox belong ? */
protected int column;
/**
* remembers, if mousePressed() was called before.
* Workaround, because dozens of mouseevents occurs after one
* mouseclick.
*/
protected boolean mousePressed = false;
/**
* @param itemListener will be notified when Checkbox will be checked/unchecked
*/
public CheckBoxHeader(ItemListener itemListener) {
rendererComponent = this;
rendererComponent.addItemListener(itemListener);
}
/** @return this */
//pasted from javax.swing.table.TableColumn.createDefaultHeaderRenderer()
//with some slight modifications.
//implements TableCellRenderer
public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (table != null) {
JTableHeader header = table.getTableHeader();
if (header != null) {
rendererComponent.setForeground(header.getForeground());
rendererComponent.setBackground(header.getBackground());
rendererComponent.setFont(header.getFont());
header.addMouseListener(rendererComponent);
}
}
rendererComponent.setText((value == null) ? "" : value.toString());
setColumn(column);
// setOpaque(true);
setHorizontalAlignment(SwingConstants.CENTER);
setHorizontalTextPosition(SwingConstants.LEFT);
super.setOpaque(true);
super.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
return rendererComponent;
}
/** @param column to which the CheckBox belongs to */
protected void setColumn(int column) {
this.column = column;
}
/** @return the column to which the CheckBox belongs to */
public int getColumn() {
return column;
}
/**************** Implementation of MouseListener ******************/
/**
* Calls doClick(), because the CheckBox doesn't receive any
* mouseevents itself. (because it is in a CellRendererPane).
*/
protected void handleClickEvent(MouseEvent e) {
// Workaround: dozens of mouseevents occur for only one mouse click.
// First MousePressedEvents, then MouseReleasedEvents, (then
// MouseClickedEvents).
// The boolean flag 'mousePressed' is set to make sure
// that the action is performed only once.
if (mousePressed) {
mousePressed=false;
JTableHeader header = (JTableHeader)(e.getSource());
JTable tableView = header.getTable();
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = tableView.convertColumnIndexToModel(viewColumn);
if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {
doClick();
}
}
}
public void mouseClicked(MouseEvent e) {
handleClickEvent(e);
//Header doesn't repaint itself properly
((JTableHeader)e.getSource()).repaint();
}
public void mousePressed(MouseEvent e) {
mousePressed = true;
}
public void mouseReleased(MouseEvent e) {
//works - problem: works even if column is dragged or resized ...
//handleClickEvent(e);
//properly repainting by the Header
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
}
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.plaf.basic.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
/**
* @author Jan-Friedrich Mutter (jmutter@bigfoot.de)
*/
public class HeaderTableMain {
public HeaderTableMain() {
//Create sample content for the JTable, don't care
String[][] data = new String[7][5];
String[] headers = new String[5];
for (int col=0; col<data[0].length; col++) {
headers[col] = "- "+col+" -";
for (int row=0; row<data.length; row++)
data[row][col] = "("+row+","+col+")";
}
DefaultTableModel dataModel = new DefaultTableModel(data, headers);
//new Table
JTable table = new JTable(dataModel);
//Create an ItemListener
MyItemListener myItemListener = new MyItemListener();
//Create for each column a HeaderCellRenderer
Enumeration enumeration = table.getColumnModel().getColumns();
while (enumeration.hasMoreElements()) {
TableColumn aColumn = (TableColumn)enumeration.nextElement();
aColumn.setHeaderRenderer(new CheckBoxHeader(myItemListener));
}
JScrollPane scrollpane = new JScrollPane(table);
//Put it into a Frame
JFrame frame = new JFrame();
frame.addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
frame.getContentPane().add(scrollpane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] argv) {
HeaderTableMain mainClass = new HeaderTableMain();
}
}
/**
* Sample ItemListener
*/
class MyItemListener implements ItemListener {
/**
* Called when a CheckBox is checked/unchecked
*/
public void itemStateChanged(ItemEvent e) {
Object source = e.getSource();
String text;
if (source instanceof AbstractButton)
text = ((AbstractButton)source).getText();
else
return;
String state = (e.getStateChange() == ItemEvent.SELECTED) ? "checked" : "unchecked";
int column = ((CheckBoxHeader)(e.getItem())).getColumn();
System.out.println("HeaderListener::itemStateChanged() "+text+" : column="+column+", state="+state);
}
}