Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Jtable Header Border Not Appearing

843804Feb 8 2005 — edited Feb 8 2005
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);
  }
}
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Mar 8 2005
Added on Feb 8 2005
1 comment
918 views