-
Bug
-
Resolution: Fixed
-
P2
-
1.4.0
-
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)
======================================================================