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

REGRESSION: NPE occurs with JTable in a JScrollPane

XMLWordPrintable

    • beta2
    • x86
    • linux
    • Verified



      Name: rmT116609 Date: 07/24/2001


      java version "1.4.0-beta"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta-b65)
      Java HotSpot(TM) Client VM (build 1.4.0-beta-b65, mixed mode)


      I have a JTable in a JScrollPane, when the table is big enough to make the
      scrollbar appear, then if I move the mouse over the table I get a NullPointer exception.
      The stacktrace:

      java.lang.NullPointerException
      at javax.swing.text.View.getViewIndex(View.java:1060)
      at javax.swing.text.View.getToolTipText(View.java:1031)
      at javax.swing.plaf.basic.BasicTextUI.getToolTipText(BasicTextUI.java:1057)
      at javax.swing.text.JTextComponent.getToolTipText(JTextComponent.java:1533)
      at javax.swing.JTable.getToolTipText(JTable.java:2380)
      at
      javax.swing.ToolTipManager$insideTimerAction.actionPerformed(ToolTipManager.java:669)
      at javax.swing.Timer.fireActionPerformed(Timer.java:256)
      at javax.swing.Timer$DoPostEvent.run(Timer.java:190)
      at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:167)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:437)
      at java.awt.EventDispatchThread.pumpOneEvent(EventDispatchThread.java:150)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:136)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:131)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:99)

      There are three files included. In fact two bugs occur:

      1. if I use the setRowHeight(int, int) and then add a new row to the table, the table is
      not repainted correctly
      2. if I use the special CellRenderer, then I get the NullPointerException

      These bugs are reproduced as follows:

      1. compile and run 'Test'
      2. at first a table with 6 rows and 4 columns is shown.
      3. press the button 'change model' --> a new row should show up, but it doesn't.
      4. move the mouse over the table, near a gridline --> an NPE occurs

      Linux version:
      RedHat 7.1 kernel 2.4.2

      The problem is NOT reproducable with java 1.3.1

      ----------------------------Test.java--------------------------------------
      import java.awt.*;
      import java.awt.event.*;
      import java.util.*;
      import javax.swing.*;
      import javax.swing.table.*;

      public class Test {
        public static void main (String[] args) {
          JFrame frame = new JFrame();
          frame.setSize(new Dimension(400, 400));
          frame.getContentPane().add(getTable());
          frame.show();
        }

        private static JComponent getTable() {
          JPanel result = new JPanel();
          result.setLayout(new BorderLayout());
          final TestTable table = new TestTable();
          JComponent scrollPane = new JScrollPane(table);
          result.add(scrollPane, BorderLayout.CENTER);
          final DefaultTableModel model = new DefaultTableModel();
          updateTableModel(table, model, 4,6);
          table.setModel(model);
          JButton button = new JButton("change model");
          button.addActionListener(new ActionListener() {
            int i = 6;
            public void actionPerformed(ActionEvent e) {
              updateTableModel(table, model, 4,++i);
            }
          });
          result.add(button, BorderLayout.SOUTH);
          return result;
        }

        private static void updateTableModel(JTable table, DefaultTableModel model, int columns, int rows) {
          Vector data = new Vector();
          Vector columndata = new Vector();
          for (int i = 0; i < rows; i++) {
            Vector v = new Vector();
            for (int j = 0; j < columns; j++) {
              v.add(i + ", " + j + (i == 2?"":"\n\n"));
            }
            data.add(v);
          }
          for (int i = 0; i < columns; i++) {
            columndata.add(String.valueOf(i));
          }
          model.setDataVector(data, columndata);
        }
      } // End of Test.java

      ----------------------TestTableCellRenderer.java----------------------------
      import javax.swing.*;
      import javax.swing.table.*;
      import javax.swing.border.*;
      import java.awt.Component;
      import java.util.*;
      import java.text.DateFormat;


      public class TestTableCellRenderer extends JTextArea implements TableCellRenderer {
        public TestTableCellRenderer() {
          super.setEditable(false);
          setBorder(new EmptyBorder(1, 1, 1, 1));
        }

        public Component getTableCellRendererComponent(JTable table, Object value,
                                                       boolean isSelected, boolean hasFocus,
                                                       int row, int column) {
          if (value == null) {
            setText("");
          } else {
            setText(String.valueOf(value));
          }

          if (isSelected) {
            setForeground(table.getSelectionForeground());
            setBackground(table.getSelectionBackground());
          } else {
            setForeground(table.getForeground());
            setBackground(table.getBackground());
          }
            
          int height = getPreferredSize().height;
          ((TestTable) table).updateRowHeight(row, column, height);
          return this;
        }

      } // End of TestTableCellRenderer.java

      ----------------------------TestTable.java-----------------------------------
      import javax.swing.*;
      import javax.swing.table.*;
      import java.util.*;

      public class TestTable extends JTable {
        List cellHeights = new ArrayList();
        TableCellRenderer c = new TestTableCellRenderer();

        public void updateRowHeight(int row, int column, int height) {
          while (cellHeights.size() <= row) {
            int [] newArray = new int[getColumnCount()];
            Arrays.fill(newArray, 0);
            cellHeights.add(newArray);
          }
          int [] rowHeights = (int []) cellHeights.get(row);
          rowHeights[column] = height;
          int maxHeight = 17;
          for (int i = 0; i < getColumnCount(); i++) {
            maxHeight = Math.max(maxHeight, rowHeights[i]);
          }
          if (getRowHeight(row) != maxHeight) {
            setRowHeight(row, maxHeight);
          }
        }

        public TableCellRenderer getCellRenderer(int row, int col) {
          return c;
        }
      } //TestTable.java
      (Review ID: 128325)
      ======================================================================

            svioletsunw Scott Violet (Inactive)
            rmandalasunw Ranjith Mandala (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: