Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4292511

JTableHeader height determined by first column given HTML text



    • Subcomponent:
    • CPU:
      generic, x86
    • OS:
      generic, windows_98, windows_nt


      Name: krT82822 Date: 11/17/99

      Java(TM) 2 Runtime Environment, Standard Edition (build 1.3beta-O)
      Java(TM) HotSpot Client VM (build 1.3beta-O, mixed mode)

      JDK1.3 behaves differently than 1.2.2 with regards to HTML headers containing
      "<p>" to create multi-line headers. 1.3 only looks to the first header when
      determining height.

      Although I've submitted this as a bug, I can understand the performance
      implications, and suggest you just document this change.

      import java.awt.event.*;
      import javax.swing.*;
      import javax.swing.table.AbstractTableModel;

      public class HTMLHeader extends JFrame {
        public HTMLHeader() {
          getContentPane().add( new JScrollPane( new JTable( new TableData() ) ) );

        class TableData extends AbstractTableModel {
          private String [] headers = {
            // Add &nbsp;<p> before Centered to enable 2-line header.
            "<html><center>Centered Heading</center></html>",
            "<html><center>Centered Multi-Line Column<p>Heading</center></html>",
          public String getColumnName(int column) {
            return headers[ column ];
          public int getColumnCount() {
            return 2;
          public int getRowCount() {
            return 1;
          public Object getValueAt(int rowIndex, int columnIndex) {
            return "Cell";

        public static void main( String [] args ) {
          HTMLHeader test = new HTMLHeader();
          test.setDefaultCloseOperation( DISPOSE_ON_CLOSE );
          test.addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
              System.exit( 0 );
          } );
          test.setVisible( true );
      (Review ID: 97996)

      Name: krT82822 Date: 02/15/2000

      orig synopsis: "JTable headers using html don't display correctly"
      15 Feb 2000 eval1127@eng -- tried the workaround for bug # 4292511...but it's still a problem in kestrel-rc1. This problem is really a dupe of 4292511.

      for win98:

      java version "1.3.0rc1"
      java(TM) 2 Runtime Environment, Standard Edition (built 1.3.0rc1-T)
      java HotSpot(TM) Client VM (build 1.3.0rc1-S mixed mode)

      and (for linux):

      java version "1.2.2-RC2"
      Classic VM (build 1.2.2-RC2-K, green threads, javacomp)

      In JDK 1.2.2 the following program displays the headers with wrapped text,
      but the header is only one line long (cropping most of the text) until it is
      resized. The text should show up correctly the first time and size correctly
      as it is displayed.

      In JDK 1.3, the text is never wrapped. What is worse is that there is
      never any indication that text is missing (whole words that can't be
      rendered completely just are cut off). Try sizing the column headers
      to see this. Cell elements at least use an ellipses to indicate that
      some text is truncated. This might be a good idea for html headers as well.
      The worst here is that HTML headers containing a line break (<br>) in JDK 1.3
      will never be displayed correctly.

      This program demonstrates that there is a problem with the interaction
      between the HTML renderering and the JTable Headers. When the table
      with these headers comes up, the headers are rendered on two lines, but
      only one line is visible. The first time the table is resized (by a user)
      the headers show better, the second time, they are perfect. Something similiar
      happens when resizing a large table to a smaller size makes the headers go
      from one line to two.

      This may be a general problem with HTML rendering. How does the renderer
      know to break lines unless it knows the current width (or height). It seems
      like one of those would be needed to decide how to render.

      import javax.swing.*;
      import javax.swing.table.*;
      import java.awt.*;
      import java.awt.event.*;

      public class TableTest {
          static String[] columnNames = {
              "<html><b><font color=black>Testing</font></b>",
              "<html><b><font color=black>Shown Today</font></b>",
              "<html><b><font color=black>This is a test of a large label to see if it
      wraps </font></b>",
              "<html><b><font color=black>t1</font></b>"
          } ;
          static Object[][] rowData = {{"1", "2", "3", "4"}, {"1", "2", "3", "this is
      a test" }};
          public static void main(String[] args)
              JFrame f = new JFrame("table test");
              JTable table = new JTable(rowData, columnNames);

              table.setPreferredScrollableViewportSize(new Dimension(400, 300));

              JScrollPane scrollPane = new JScrollPane(table);
              f.getContentPane().add(scrollPane, BorderLayout.CENTER);

              f.addWindowListener(new WindowAdapter() {
                  public void windowClosing(WindowEvent e) {
      (Review ID: 101195)


          Issue Links



              Unassigned Unassigned
              kryansunw Kevin Ryan (Inactive)
              0 Vote for this issue
              0 Start watching this issue