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!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

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
915 views