-
Bug
-
Resolution: Won't Fix
-
P3
-
None
-
5.0
-
x86
-
windows_2000
Name: gm110360 Date: 03/03/2004
FULL PRODUCT VERSION :
J2SE 1.4.2-b28
J2SE 1.5.0 beta
ADDITIONAL OS VERSION INFORMATION :
Win 2000
A DESCRIPTION OF THE PROBLEM :
Add editable JComboBoxes to a JTable.
Click on arrow button to display pop up for the combobox.
Click on arrow button again to hide the pop up.
Move to a different component in the UI.
The combo box is still displayed with the arrow button still visible.
It should have been removed on a focus lost event.
The combo box is correctly removed if you move to a different cell in the table
rather than a different widget in the application.
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Please run the code below: -
1. Click on the drop-down combo-box(under column veggy)
2. Click in "set focus here" textfield.
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Dimension;
public class TableExample3
implements java.awt.event.ActionListener
{
ExampleTableModel dataModel;
final String[] names = {"First Name", "Last Name", "Favorite Color",
"Favorite Number", "Veggy"};
Object[][] data = {
{"Mark", "Andrews", "Red", new Integer(2), new Boolean(false)},
{"Tom", "Ball", "Blue", new Integer(99), new Boolean(false)},
{"Alan", "Chung", "Green", new Integer(838), new Boolean(false)},
{"Jeff", "Dinkins", "Turquois", new Integer(8), new Boolean(false)},
{"Amy", "Fowler", "Yellow", new Integer(3), new Boolean(false)},
{"Brian", "Gerhold", "Green", new Integer(0), new Boolean(false)},
{"James", "Gosling", "Pink", new Integer(21), new Boolean(false)},
{"David", "Karlton", "Red", new Integer(1), new Boolean(false)},
{"Dave", "Kloba", "Yellow", new Integer(14), new Boolean(false)},
{"Peter", "Korn", "Purple", new Integer(12), new Boolean(false)},
{"Phil", "Milne", "Purple", new Integer(3), new Boolean(false)},
{"Dave", "Moore", "Green", new Integer(88), new Boolean(false)},
{"Hans", "Muller", "Maroon", new Integer(5), new Boolean(false)},
{"Rick", "Levenson", "Blue", new Integer(2), new Boolean(false)},
{"Tim", "Prinzing", "Blue", new Integer(22), new Boolean(false)},
{"Chester", "Rose", "Black", new Integer(0), new Boolean(false)},
{"Ray", "Ryan", "Gray", new Integer(77), new Boolean(false)},
{"Georges", "Saab", "Red", new Integer(4), new Boolean(false)},
{"Willie", "Walker", "Phthalo Blue", new Integer(4), new Boolean(false)},
{"Kathy", "Walrath", "Blue", new Integer(8), new Boolean(false)},
{"Arnaud", "Weber", "Green", new Integer(44), new Boolean(false)}
};
public TableExample3() {
JFrame frame = new JFrame("Table");
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {System.exit(0);}});
// Create a model of the data.
dataModel = new ExampleTableModel();
JComboBox _editor = new JComboBox();
_editor.addItem(new Boolean(false));
_editor.addItem(new Boolean(true));
// Instead of making the table display the data as it would normally with:
JTable tableView = new JTable(dataModel);
// Add a sorter, by using the following three lines instead of the one above.
//TableSorter sorter = new TableSorter(dataModel);
//JTable tableView = new JTable(sorter);
//sorter.addMouseListenerToHeaderInTable(tableView);
tableView.setDefaultEditor(Boolean.class, new
DefaultCellEditor(_editor));
JScrollPane scrollpane = new JScrollPane(tableView);
scrollpane.setPreferredSize(new Dimension(700, 300));
frame.getContentPane().setLayout(new java.awt.GridBagLayout());
frame.getContentPane().add(scrollpane);
JTextField _text = new JTextField("Set focus here");
frame.getContentPane().add(_text);
JButton _button = new JButton("Click to remove row");
frame.getContentPane().add(_button);
_button.addActionListener(this);
frame.pack();
frame.setVisible(true);
}
public void actionPerformed(java.awt.event.ActionEvent e)
{
dataModel.removeARow();
}
public static void main(String[] args) {
new TableExample3();
}
class ExampleTableModel extends AbstractTableModel
{
// These methods always need to be implemented.
public int getColumnCount() { return names.length; }
public int getRowCount() { return data.length;}
public Object getValueAt(int row, int col) {return data[row][col];}
// The default implementations of these methods in
// AbstractTableModel would work, but we can refine them.
public String getColumnName(int column) {return names[column];}
public Class getColumnClass(int col) {return getValueAt(0,
col).getClass();}
public boolean isCellEditable(int row, int col) {return true;}
public void setValueAt(Object aValue, int row, int column) {
data[row][column] = aValue;
}
public void removeARow()
{
// Remove last row from array
Object[][] _smaller_data = new Object[data.length - 1][];
System.arraycopy(data, 0, _smaller_data, 0,
_smaller_data.length);
data = _smaller_data;
System.out.println("Rows = " + data.length);
System.out.println("Cols = " + data[0].length);
fireTableDataChanged();
}
};
}
REPRODUCIBILITY :
This bug can be reproduced always.
(Incident Review ID: 238317)
======================================================================
- relates to
-
JDK-4709394 1.4 REGRESSION: JTable does not take entered data.
-
- Resolved
-
-
JDK-4677999 REGRESSION: Data not stored in TableModel when focus lost from JTable
-
- Closed
-
-
JDK-4724980 JTable: Add API to control what happens to edits when table loses focus.
-
- Open
-