Setting JTable cell editor
Hallo,
I have troubles setting jtable cell edtior. when i run code below, editor stays unchnaged.
Do you know where's the problem, please (except in programmer^_^) ???
import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
public class Test extends JFrame {
JTable table;
Test() {
// Create table model
table = new JTable();
table.setModel(new DefaultTableModel(
new Object[][] {
{ Boolean.TRUE, Integer.valueOf(10) },
{ "Hallo!", Boolean.FALSE },
}, new String[] { "Col1", "Col2" }));
// Setup frame a little
setLayout(new BorderLayout());
setBounds(new Rectangle(300,300,200,100));
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(table,BorderLayout.CENTER);
* Two calls below have no effect:-(
* What did i wrong?
// set cell editor for all cells
table.setCellEditor(new DefaultCellEditor(
new JComboBox(new String[] { "0", "1" }) ));
// Use checkbox for booleans
table.setDefaultEditor(Boolean.class, new DefaultCellEditor(
new JCheckBox() ));
// Use combobox for strings
table.setDefaultEditor(String.class, new DefaultCellEditor(
new JComboBox( new String[] { "Hallo!", "Bye!" } ) ));
public static void main(String[] arg) {
Test test = new Test();
test.setVisible(true);
}
Hi again,
yes it works when i set it for single column, but i'd like to use default editor, because column count is not fixed.
According to documentation: "Sets a default cell editor to be used if no editor has been set in a TableColumn. If no editing is required in a table, or a particular column in a table, uses the isCellEditable method in the TableModel interface to ensure that this JTable will not start an editor in these columns. If editor is null, removes the default editor for this column class."
So when i call
column.setCellEditor(null); in TableColumnModelListener columnAdded event. But still it's not working. See sample below (i've changed it to cell renderer coz result is clear on single view, but problem stays same)
More over problem seems to be with algoritm that decide which class to use. Object takes preference any time. W/o it npe arries.
Regards
Adam
import java.awt.*;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
public class Test extends JFrame {
JTable table;
Test() {
// Create table model
table = new JTable();
table.setModel(new DefaultTableModel(
new Object[][] {
{ Boolean.TRUE, Integer.valueOf(10) },
{ "Hallo!", Boolean.FALSE },
}, new String[] { "Col1", "Col2" }));
// Setup frame a little
setLayout(new BorderLayout());
setBounds(new Rectangle(300,300,200,100));
setDefaultCloseOperation(EXIT_ON_CLOSE);
add(table,BorderLayout.CENTER);
table.setDefaultRenderer(Object.class,new Renderer(Color.YELLOW));
table.setDefaultRenderer(String.class,new Renderer(Color.BLUE));
table.setDefaultRenderer(Boolean.class,new Renderer(Color.RED));
table.setDefaultRenderer(Integer.class,new Renderer(Color.GREEN));
// use default renderer in all columns
table.getColumn(table.getColumnName(0)).setCellRenderer(null);
table.getColumn(table.getColumnName(0)).setCellRenderer(null);
public static void main(String[] arg) {
Test test = new Test();
test.setVisible(true);
class Renderer extends DefaultTableCellRenderer {
Color color;
Renderer(Color color) { this.color = color; }
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setBackground(color);
setToolTipText("Class is "+value.getClass().getName());
return this;
}Message was edited by:
a3cchan
Similar Messages
-
Tab transversal while using JTextArea as a JTable cell editor..
I'm working on a project that will use a JTable with a JTextArea cell editor to create a chart for classroom scheduling. Searching on Google, I found a way to use a JTextArea as a cell editor and render the cell properly. However, when editing a cell, pressing the Tab key inserts a tab, rather than leaving the cell and going to the next one, as happens with just a regular JTable. In fact, none of the keyboard shortcuts that work on a JTable work once the JTextArea cell editor is used. Does anyone know of any way to resolve this? Below is some code I'm using to create a sample GUI, just to verify that I can do this. Another question is would it be easier to use a bunch of JLabels and JTextAreas, remove the padding from those JTextAreas, and try to allow for Tab transversals between stand-alone JTextAreas, rather than JTextAreas as JTable cell editors?
Thanks!
package edu.elon.table;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
public class GUI
private JFrame frame;
private String[] columnNames = {"Classroom", "8:00-9:10", "9:25-10:35",
"10:50-12:00", "12:15-1:25", "1:40-2:50", "1:40-3:20 (MW)",
"3:35-5:15 (MW)", "5:30-7:10 (MW)"};
private Object[][] data = {columnNames,
{"ALAM 201 (42)\nENG 110 LAB", "", "", "", "", "", "", "", ""},
{"ALAM 202 (42)\nDP/DVD", "", "", "", "", "", "", "", ""},
{"ALAM 203 (38)\nDP/DVD", "", "", "", "", "", "", "", ""},
{"ALAM 205 (40)\n", "", "", "", "", "", "", "", ""},
{"ALAM 206 (39)\nSINK, TV/VCR", "", "", "", "", "", "", "", ""},
{"ALAM 207 (40+)\nDP/DVD", "", "", "", "", "", "", "", ""},
{"ALAM 214 (38)\nTV/VCR", "", "", "", "", "", "", "", ""},
{"ALAM 215 (42)\nTV/VCR", "", "", "", "", "", "", "", ""},
{"ALAM 216 (42)\n", "", "", "", "", "", "", "", ""},
{"ALAM 301 (40)\nTV/VCR", "", "", "", "", "", "", "", ""},
{"ALAM 302 (38)\nDP/DVD", "", "", "", "", "", "", "", ""},
{"ALAM 304 (35)\nFRENCH", "", "", "", "", "", "", "", ""},
{"ALAM 314 (30)\nDP, PSY, COMPUTER ASSISTED", "", "", "", "", "", "",
{"ALAM 315 (40)\nPC LAB, DP/DVD", "", "", "", "", "", "", "", ""}};
private JTable table;
public GUI()
frame = new JFrame();
table = new JTable(data, columnNames);
table.setRowHeight(table.getRowHeight()*2);
TableColumnModel cModel = table.getColumnModel();
TextAreaRenderer renderer = new TextAreaRenderer();
TextAreaEditor editor = new TextAreaEditor();
for (int i = 0; i < cModel.getColumnCount(); i++)
cModel.getColumn(i).setCellRenderer(renderer);
cModel.getColumn(i).setCellEditor(editor);
frame.setLayout(new GridLayout(1,0));
frame.add(table);
frame.pack();
frame.setVisible(true);
public static void main (String[] args)
GUI gui = new gui();
* Written by Dr. Heinz Kabutz, found through online newsletter via Google.
class TextAreaRenderer extends JTextArea
implements TableCellRenderer {
private final DefaultTableCellRenderer adaptee =
new DefaultTableCellRenderer();
/** map from table to map of rows to map of column heights */
private final Map cellSizes = new HashMap();
public TextAreaRenderer() {
setLineWrap(true);
setWrapStyleWord(true);
public Component getTableCellRendererComponent(//
JTable table, Object obj, boolean isSelected,
boolean hasFocus, int row, int column) {
// set the colours, etc. using the standard for that platform
adaptee.getTableCellRendererComponent(table, obj,
isSelected, hasFocus, row, column);
setForeground(adaptee.getForeground());
setBackground(adaptee.getBackground());
setBorder(adaptee.getBorder());
setFont(adaptee.getFont());
setText(adaptee.getText());
// This line was very important to get it working with JDK1.4
TableColumnModel columnModel = table.getColumnModel();
setSize(columnModel.getColumn(column).getWidth(), 100000);
int height_wanted = (int) getPreferredSize().getHeight();
addSize(table, row, column, height_wanted);
height_wanted = findTotalMaximumRowSize(table, row);
if (height_wanted != table.getRowHeight(row)) {
table.setRowHeight(row, height_wanted);
return this;
private void addSize(JTable table, int row, int column,
int height) {
Map rows = (Map) cellSizes.get(table);
if (rows == null) {
cellSizes.put(table, rows = new HashMap());
Map rowheights = (Map) rows.get(new Integer(row));
if (rowheights == null) {
rows.put(new Integer(row), rowheights = new HashMap());
rowheights.put(new Integer(column), new Integer(height));
* Look through all columns and get the renderer. If it is
* also a TextAreaRenderer, we look at the maximum height in
* its hash table for this row.
private int findTotalMaximumRowSize(JTable table, int row) {
int maximum_height = 0;
Enumeration columns = table.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn tc = (TableColumn) columns.nextElement();
TableCellRenderer cellRenderer = tc.getCellRenderer();
if (cellRenderer instanceof TextAreaRenderer) {
TextAreaRenderer tar = (TextAreaRenderer) cellRenderer;
maximum_height = Math.max(maximum_height,
tar.findMaximumRowSize(table, row));
return maximum_height;
private int findMaximumRowSize(JTable table, int row) {
Map rows = (Map) cellSizes.get(table);
if (rows == null) return 0;
Map rowheights = (Map) rows.get(new Integer(row));
if (rowheights == null) return 0;
int maximum_height = 0;
for (Iterator it = rowheights.entrySet().iterator();
it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
int cellHeight = ((Integer) entry.getValue()).intValue();
maximum_height = Math.max(maximum_height, cellHeight);
return maximum_height;
* Written by Dr. Heinz Kabutz, found through online newsletter via Google.
class TextAreaEditor extends DefaultCellEditor
public TextAreaEditor() {
super(new JTextField());
final JTextArea textArea = new JTextArea();
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setBorder(null);
editorComponent = scrollPane;
delegate = new DefaultCellEditor.EditorDelegate() {
public void setValue(Object value)
textArea.setText((value != null) ? value.toString() : "");
public Object getCellEditorValue()
return textArea.getText();
}Using the KeyEvent manager and playing around with the JTextArea, I was able to get a JTable using JTextAreas as the cell editors that worked very close to the way the regular JTable works. You have to hit Tab twice to shift focus to another cell, or hit Tab once and then an arrow key. Also, Alt-Enter will allow you to enter a cell for editing. All of the changes were made to the TextAreaEditor class, which should now read as follows:
class TextAreaEditor extends DefaultCellEditor implements KeyListener
private int lastKeyCode;
public TextAreaEditor(final JTable table) {
super(new JTextField());
lastKeyCode = KeyEvent.CTRL_DOWN_MASK;
final JTextArea textArea = new JTextArea();
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
textArea.addKeyListener(this);
textArea.setFocusable(true);
textArea.setFocusAccelerator((char) KeyEvent.VK_ENTER);
JScrollPane scrollPane = new JScrollPane(textArea);
scrollPane.setBorder(null);
scrollPane.setFocusable(false);
editorComponent = scrollPane;
delegate = new DefaultCellEditor.EditorDelegate() {
public void setValue(Object value) {
textArea.setText((value != null) ? value.toString() : "");
public Object getCellEditorValue() {
return textArea.getText();
public void keyTyped(KeyEvent ke)
// TODO Auto-generated method stub
public void keyPressed(KeyEvent ke)
if (ke.getKeyCode() == KeyEvent.VK_TAB)
ke.consume();
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.focusNextComponent();
return;
if (ke.getKeyCode() == KeyEvent.VK_TAB && ke.isShiftDown())
ke.consume();
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.focusPreviousComponent();
return;
if ((lastKeyCode == KeyEvent.CTRL_DOWN_MASK) &&
(ke.getKeyCode() == KeyEvent.VK_ENTER))
ke.consume();
editorComponent.requestFocus();
else
lastKeyCode = ke.getKeyCode();
public void keyReleased(KeyEvent ke)
// TODO Auto-generated method stub
} -
Custom JTable cell editor problem
I have a custom JTable cell editor which is a JPanel with 2 JtextFields, One for a name, the other for a data value. My problem lies in when the the cell is selected and then the user start typing. The JTextfield outline shows up, but there is no carat. I can only edit the cell when I click the mouse in it again. I have my isCellEditable method set to only allow editing on 2 mouse clicks, but I did try it with just returning true and had the same problem. Please help.
Code:
class cellValue {
String name;
String data;
Color nameColor;
Color dataColor;
Font font;
public cellValue(String n, String d, Color nC, Color dC, Font ff){
name = n;
data = d;
nameColor = nC;
dataColor = dC;
font = ff;
} //end class
public class TextFieldCellEditor extends JPanel implements TableCellRenderer, TableCellEditor{
private EventListenerList listenerList = new EventListenerList();
private ChangeEvent event = new ChangeEvent(this);
private cellValue s;
private int e_row=0;
private int e_col=0;
private JTextField ta;
private JTextField tb;
public TextFieldCellEditor() {
setLayout(new GridBagLayout());
ta = new JTextField();
tb = new JTextField();
tb.setHorizontalAlignment(SwingConstants.RIGHT);
add(ta, new GridBagConstraints(0,0,1,1,0.6,0.0,java.awt.GridBagConstraints.WEST,java.awt.GridBagConstraints.BOTH,new Insets(0,1,0,0),0,0));
add(new JLabel(" "),new GridBagConstraints(1,0,1,1,0.1,0.0,java.awt.GridBagConstraints.WEST,java.awt.GridBagConstraints.BOTH,new Insets(0,1,0,0),0,0));
add(tb, new GridBagConstraints(2,0,1,1,0.3,0.0,java.awt.GridBagConstraints.EAST,java.awt.GridBagConstraints.BOTH,new Insets(0,1,0,0),0,0));
} //end init
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected,
boolean hasFocus,int row, int column) {
s = (cellValue)value;
e_row = row;
e_col = column;
ta.setText(s.name);
tb.setText(s.data);
ta.setFont(s.font);
tb.setFont(s.font);
ta.setForeground(s.nameColor);
tb.setForeground(s.dataColor);
setForeground(table.getForeground());
setBackground(table.getBackground());
ta.setBackground(table.getBackground());
tb.setBackground(table.getBackground());
ta.setCaretColor(Color.WHITE);
tb.setCaretColor(Color.WHITE);
return (JComponent)(this);
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return (getTableCellRendererComponent(table, value,isSelected, true, row, column));
public boolean isCellEditable(EventObject e) {
if (e instanceof MouseEvent) {
return ((MouseEvent)e).getClickCount() >= 2;
} return true;
// return true;
public boolean shouldSelectCell(EventObject anEvent) {
return (true);
public void cancelCellEditing() {
public boolean stopCellEditing() {
fireEditingStopped();
return (true);
public Object getCellEditorValue() {
return (ta.getText());
public void addCellEditorListener(CellEditorListener l){
try {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {requestFocus();}
} catch (Exception e) {};
listenerList.add(CellEditorListener.class, l);
public void removeCellEditorListener(CellEditorListener l) {
listenerList.remove(CellEditorListener.class, l);
protected void fireEditingStopped(){
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2)
((CellEditorListener)listeners[i+1]).editingStopped(event);
protected void fireEditingCanceled() {
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length - 2; i >= 0; i -= 2)
((CellEditorListener)listeners[i+1]).editingCanceled(event);
} //end classThanks again for the repley.
I tried removing the celleditorlistener and using the setSurrenderFocusOnKeystroke, but it did not work. The textfield is editable;
I did change:
public void addCellEditorListener(CellEditorListener l){
try {
SwingUtilities.invokeLater(
new Runnable() {
public void run() {ta.requestFocus();}
} catch (Exception e) {};
listenerList.add(CellEditorListener.class, l);
}This allows the first textfield to request focus and this seems to work. But when I highlight a cell, then start typing, the first character I type puts me into the editor, but it is lost. Example:
I type hello
and get ello in the cell. Then when I press enter the input is excepted and the selection goes to the next cell, but I cannot move the Highlight cursor at all, seems locked. The only way I can continue to the next cell is to use the mouse.
You said you had a cell editor working. Would you care to share as an example. This is killing me to get this to work properly.
Thanks again
Dave -
JTree: How to set different cell editor for different tree Nodes.
I have a JTree and I want to set different cell editors for different node depending on some condition. E.g. I want to set ComboBox as editor for leaf node but each leaf node will have its own set of data.
Any help or pointer?
Thanks in advance
Sachintake there:
http://www.mutualinstrument.com/Easy/FAQ/Tree/tree.html -
JPanel as a JTable Cell Editor
I want to use a JPanel and as a JTable Cell Editor. The JPanel consists of a JTextField and a JButton. When I bring it up as an editor all works fine until I change the text field value and click on another line causing the editor to be stopped. Then my app seems to go into a processing frenzy which effectively stop me from doing anything else (the app has trouble repainting itself as well).
I'm assuming I'm not passing an important message from the JPanel to the text field but am not sure. Has anyone had success in doing this? What am I missing?
Thanks in advance,
PhillipLooks like I was too quick off the draw in posting this.
My problem was due to some old "expiremental" code that was processing key binding.
Once I removed the unnecessary code all worked well. -
AutoComplete JComboBox As JTable cell editor
Hello, when I try to use AutoComplete JComboBox as my JTable cell editor, I facing the following problem
1) Exception thrown when show pop up. - Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: component must be showing on the screen to determine its location
2) Unable to capture enter key event.
Here is my complete working code. With the same JComboBox class, I face no problem in adding it at JFrame. But when using it as JTable cell editor, I will have the mentioned problem.
Any advice? Thanks
import javax.swing.*;
import javax.swing.JTable.*;
import javax.swing.table.*;
import java.awt.event.*;
* @author yccheok
public class NewJFrame extends javax.swing.JFrame {
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
/* Combo Box Added In JFrame. Work as expected. */
final JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Chasing toddlers");
comboBox.setEditable(true);
comboBox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
System.out.println("is enter");
return;
System.out.println("typed");
comboBox.setSelectedIndex(0);
comboBox.showPopup();
getContentPane().add(comboBox, java.awt.BorderLayout.SOUTH);
public JTable getMyTable() {
return new JTable() {
Combo Box Added In JTable as cell editor. Didn't work as expected:
1. Exception thrown when show pop up.
2. Unable to capture enter key event.
public TableCellEditor getCellEditor(int row, int column) {
final JComboBox comboBox = new JComboBox();
comboBox.addItem("Snowboarding");
comboBox.addItem("Rowing");
comboBox.addItem("Chasing toddlers");
comboBox.setEditable(true);
comboBox.getEditor().getEditorComponent().addKeyListener(new KeyAdapter() {
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
System.out.println("is enter");
return;
System.out.println("typed");
comboBox.setSelectedIndex(0);
comboBox.showPopup();
return new DefaultCellEditor(comboBox);
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
// <editor-fold defaultstate="collapsed" desc=" Generated Code ">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTable1 = getMyTable();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jTable1.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
{null, null, null, null},
{null, null, null, null},
{null, null, null, null},
{null, null, null, null}
new String [] {
"Title 1", "Title 2", "Title 3", "Title 4"
jScrollPane1.setViewportView(jTable1);
getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
pack();
}// </editor-fold>
* @param args the command line arguments
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
// Variables declaration - do not modify
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTable jTable1;
// End of variables declaration
}You need to create a custom CellEditor which will prevent these problems from occurring. The explanation behind the problem and source code for the new editor can be found at Thomas Bierhance's site http://www.orbital-computer.de/JComboBox/. The description of the problem and the workaround are at the bottom of the page.
-
Custom JTable cell editors and persistence
I have a JTable with an underlying data model (an extension of AbstractTableModel) that uses custom cell editors in the last column. The cell editor in that column, for a given row, depends on the value selected in another column of the same row. The cell editors include text, date, list, and tree editors (the last one in a separate dialogue). The number of rows is changeable.
I have need to persist the data for a populated table from time to time, for restoration later on. I've achieved that, such that the data model is recreated, the table appears correct, and the appropriate cell editors activated (by creating new instances of the editors' classes).
However, my problem is that the (custom) cell editors do not reflect the data in the model when editing mode is begun the first time after restoration. Eg. the text editor is always empty, the list editor shows the first item, and no node is selected in the tree editor.
If I've restored the model correctly, should the editors properly reflect the underlying data when they are set to editing mode?
I suspected not, and thus tried to explicitly 'set' the correct values immediately after each editor is recreated ... but to no avail.
Does anyone have any thoughts, or experience with something similar? I'm happy to supply code.You can use html tags within Swing, so I think you can do the following:
* MyRenderer.java
* Created on 26 April 2007, 10:27
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
package newpackage;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.TableCellRenderer;
* @author CS781RJ
public class MyRenderer extends JLabel implements TableCellRenderer
public MyRenderer()
setHorizontalTextPosition(SwingConstants.RIGHT);
setIconTextGap(3);
setOpaque(true);
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean cellHasFocus, int row, int column)
if (isSelected)
setBackground(table.getSelectionBackground());
setForeground(table.getSelectionForeground());
else
setBackground(table.getBackground());
setForeground(table.getForeground());
if (value instanceof String)
if ((value != null) && (value.toString().length() > 0))
System.out.println("Value: " + value.toString());
setFont(new java.awt.Font("Tahoma", 0, 11));
setText("<html>" + value.toString().replaceAll("\n", "<br>") + "</html>");
return this;
}In the class that has the JTable, use the code AFTER declaring the values, columns, etc:
jTable1.getColumnModel().getColumn(0).setCellRenderer(new MyRenderer());
jTable1.setValueAt("Riz\nJavaid", 0, 0);One thing I haven't done is to resize the cell heights, make sure this is done.
Hope this helps
Riz -
How to make JPanel as JTable Cell Editor (Urgent help needed)
Hi!
I want to make JPanel (with a JTextField, 3 JLabels and 1 JTextArea) as cell editor for one column. Can somebody help me on this?
Does anybody have any sample code? I will greatly appreciate ur help.
Thanks,
SnehalOkie. In "How to use JTables" page found in the JAVA website (there is a link from the JTable section of the JAVA API documentation), there is a sample code for a sample color chooser. What this does is, adds a button with its action listener set to pop up a color chooser window. In this, rendering is still through a JLabel.
This example would be of good help to you. Plus, this example gives me a feeling that what u ask is possible. -
Hi All
I created a CalendarPanel, which contains a combobox for months and a spinner for year and grid of JLabels to display dates.
And, a JTable with a cell which holds a date value. I created a cell editor with JSpinner to increment or decrement date by 1, which is practically not good. So I added a button top popup the calendar and user selects the date.
Cell editor is a JPanel with a spinner and a small JButton. The click event of this button shows a Calendar (another JPanel) in which we can select the date.
The spinner in the cell editor and the Calendar are linked to each other so that if user clicks on the spinner to change the date, that change reflects in the calendar also, and vice versa.
I am able to popup the calendar on top of JTable at appropriate location (exactly below the cell) and when user selects the date it changes the value of spinner and vice versa.
With this I have two problems.
1. When user clicks on some other area of the calendar (except spinner) the calendar should automatically disappear. Right now when user double clicks on the date it disappears.
2. In the calendar panel when I click on combo box to select the month or on the spinner to change the year - table cell is losing its focus and stopping the cell editing, means no link with calendar and the cell. But this is not happening with the label click (I guess this is because JLabels have no focus)
How can I solve these 2.
Thanks in advance.1. When user clicks on some other area of the calendar
(except spinner) the calendar should automatically
disappear. Right now when user double clicks on the
date it disappears. Add a mouse listener to the other components that updates the calendar, the setVisible(false).
2. In the calendar panel when I click on combo box to
select the month or on the spinner to change the year
- table cell is losing its focus and stopping the cell
editing, means no link with calendar and the cell. But
this is not happening with the label click (I guess
this is because JLabels have no focus)
Have your cell editor extend DefaultCellEditor. In the constructor, set the editorComponent to your new calendar component. Add a mouse listener (adapter) to the editorComponent - in mouseClicked, call stopCellEditing(). -
JTable cell editor and row selection
I have a JTable with 8 columns and the last column is editable and has a custom table cell editor. The user can edit cells in that column or select a row and use buttons above the table to do such things as delete the row. So far so good. However if the user selects a row by clicking on a cell in the editable column and tries to delete the last row(for example) the row disappears except for the cell in the last column which is left hanging with the cursor in it.
I do a table.clearSelection(). Do I need to set the focus elsewhere in the table?
Help! and thanks.Before you delete the row, cancel the in-process editing:
if( _table.isEditing() ) {
_table.getCellEditor().cancelCellEditing();
// Delete the row in the model -
Hi, I have a custom cell editor component being used on my JTable (a calendar component) and am having problems bringing the component out of edit mode when selecting another cell.
If I click on a cell it enters edit mode correctly, the I can drop a popup window out from this editor to display the calendar. If however I move to another cell this window remains active.
Could anyone explain how to come out of edit mode when moving to another cell (not necessarily selecting just moving the mouse in to another) ?
I also have a second problem in that the calendar editor doesn't set the value in to the cell when choosing a date from the component. It keeps the original value that was in the cell. I have implemented a setValueAt() method so I'm not sure why this is not fired, any ideas?? Code is below :
public class DueDateTableModel extends AbstractTableModel {
private Vector vAllDueDates = null;
private Connection conn = null;
private Statement stmt = null;
private ResultSet rsDueDates = null;
private int iColCount;
private String sSqlDueDates = null;
private String[] testColNames = null;
public DueDateTableModel(int pColCount, Vector pAllDueDates, String[] pColNames){
iColCount = pColCount;
vAllDueDates = pAllDueDates;
testColNames = pColNames;
populateTableCells();
//setupEditors();
public int getColumnCount() {
return iColCount;
public int getRowCount() {
return vAllDueDates.size();
public String getColumnName(int iCol) {
return testColNames[iCol];
public Object getValueAt(int iRow, int iCol) {
// TODO Auto-generated method stub
Vector v = (Vector)vAllDueDates.elementAt(iRow);
return v.elementAt(iCol);
public void setValueAt(Object oValue, int iRow, int iCol) {
Vector v = (Vector)vAllDueDates.elementAt(iRow);
v.setElementAt(oValue,iCol);
fireTableCellUpdated(iRow,iCol);
public boolean isCellEditable(int iRow, int iCol) {
if(getValueAt(iRow,iCol)==null){
return false;
}else{
return true;
private class DueDateEditor extends CalendarComboBox implements TableCellEditor{
//protected EventListenerList listenerList = new EventListenerList();
//protected ChangeEvent changeEvent = new ChangeEvent(this);
public DueDateEditor(){
super();
public void removeCellEditorListener(CellEditorListener l){
//listenerList.remove(CellEditorListener.class, l);
public Component getTableCellEditorComponent(JTable table, Object value
, boolean isSelected, int row, int column){
//Just return the input panel and not the panel that the calendar comboBox is on
return this.inputPanel;
public Object getCellEditorValue(){
return this.getDate();
public boolean isCellEditable(EventObject evt) {
//if (evt instanceof MouseEvent) {
// return ((MouseEvent)evt).getClickCount() >= 2;
return true;
public boolean shouldSelectCell(EventObject anEvent){
return false;
public boolean stopCellEditing(){
//this.setDate();
return true;
public void cancelCellEditing(){
public void addCellEditorListener(CellEditorListener l){
//listenerList.add(CellEditorListener.class, l);
/*protected void fireEditingStopped() {
CellEditorListener listener;
Object[] listeners = listenerList.getListenerList();
for (int i = 0; i < listeners.length; i++) {
if (listeners[i] == CellEditorListener.class) {
listener = (CellEditorListener) listeners[i + 1];
listener.editingStopped(changeEvent);
}Sorry the classes are quite basic, I'm not very familiar with custom cell editors, I have normally used default ones like combobox etc.
Regards
AlanTo get better help sooner, post a SSCCE that clearly demonstrates your problem.
To post code, use the code tags -- [code]Your Code[/code]will display asYour CodeOr use the code button above the editing area and paste your code between the {code}{code} tags it generates.
luck, db -
Problem using an editable JComboBox as JTable cell editor
Hi,
i have a problem using an editable JComboBox as cell editor in a JTable.
When i edit the combo and then I press the TAB or ENTER key then all works fine and the value in the TableModel is updated with the edited one, but if i leave the cell with the mouse then the value is not passed to the TableModel. Why ? Is there a way to solve this problem ?
Regards
sergio setteif (v1.4) [url
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JTa
le.html#setSurrendersFocusOnKeystroke(boolean)]go
hereelse [url
http://forum.java.sun.com/thread.jsp?forum=57&thread=43
440]go here
Thank you. I've also found this one (the first reply): http://forum.java.sun.com/thread.jsp?forum=57&thread=124361 Works fine for me.
Regards
sergio sette -
JTable cell editor not working
Hello there,
I am new to Java programming,
I am trying to create a check box in a table cell which the user should able manipulate when the JTable is showing, the renderer is working fine but the editor is not , the overriden method getTableCellEditorComponent never gets a call, getTableCellRendererComponent does get a call and renderer works fine.
any ideas whats wrong here ?? or what could be wrong which makes getTableCellEditorComponent not get called ?
my renderere and editor code is like this
package com.itrsgroup.swing.componentmanager.dockablemanager;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.EventObject;
import javax.swing.AbstractCellEditor;
import javax.swing.JCheckBox;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
* A cell renderer and a cell editor for rendering and editing the filters active state.
public class ActiveCheckBoxRendererEditor extends AbstractCellEditor
implements TableCellEditor, TableCellRenderer, ItemListener
private Font font = new Font("Verdana", Font.BOLD, 11 );
private JCheckBox editor = new JCheckBox("Inactive");
private JCheckBox renderer = new JCheckBox("Inactive");
private String strSelectedText;
private String strNotSelectedText;
private Color colourActive = new Color(51,153,51);
private Color colourInActive = Color.RED;
/** Constructor. */
public ActiveCheckBoxRendererEditor()
this( "Selected", "Not Selected" );
* Constructor.
* @param strSelText - the text to render when selected.
* @param strNotSelText - the text to render when not selected.
public ActiveCheckBoxRendererEditor(String strSelText, String strNotSelText)
strSelectedText = strSelText;
strNotSelectedText = strNotSelText;
renderer = new JCheckBox( strNotSelectedText );
renderer.setHorizontalTextPosition( SwingConstants.CENTER );
renderer.setVerticalTextPosition( SwingConstants.TOP);
renderer.setHorizontalAlignment( SwingConstants.CENTER );
renderer.setVerticalAlignment( SwingConstants.CENTER );
renderer.setFont( font );
editor = new JCheckBox( strNotSelectedText );
editor.setBackground( UIManager.getColor("Table.selectionBackground") );
editor.setHorizontalTextPosition( SwingConstants.CENTER );
editor.setVerticalTextPosition( SwingConstants.TOP );
editor.setHorizontalAlignment( SwingConstants.CENTER );
editor.setVerticalAlignment( SwingConstants.CENTER );
editor.setFont( font );
editor.addItemListener( this );
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
return editor;
@Override
public boolean isCellEditable(EventObject arg0)
// TODO Auto-generated method stub
return true;
@Override
public Object getCellEditorValue()
return editor.isSelected();
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
Boolean bool = (Boolean) value;
renderer.setSelected( bool );
renderer.setText( bool ? strSelectedText : strNotSelectedText);
renderer.setForeground( bool ? colourActive : colourInActive );
if( isSelected )
renderer.setBackground( table.getSelectionBackground() );
else
renderer.setBackground( table.getBackground() );
return renderer;
@Override
public void itemStateChanged(ItemEvent e)
boolean isSelected = e.getStateChange() == ItemEvent.SELECTED;
editor.setText( isSelected ? strSelectedText : strNotSelectedText);
stopCellEditing();
and this is how I install it on my JTable
ActiveCheckBoxRendererEditor cbc = new ActiveCheckBoxRendererEditor("Active", "Inactive");
TableColumn
activeColumn = this.getColumnModel().getColumn( 3 );
activeColumn.setCellEditor( cbc);
activeColumn.setCellRenderer( cbc );
activeColumn.setPreferredWidth( 80 );
activeColumn.setMaxWidth( 200 );
activeColumn.setMinWidth( 80 );thanks
AhmedIs the column editable?
If you need further help then you need to create a [Short, Self Contained, Compilable and Executable, Example Program (SSCCE)|http://homepage1.nifty.com/algafield/sscce.html], that demonstrates the incorrect behaviour. -
How to set JTable cell editable/non-editable dynamically using NetBean?
I am using NetBean 6.5, create a database desktop application, I using the persistence entity manager to bind my JTable with database.
Now, I want to set practicular cells which are enable and disable, I tried to create my own table model and override the isEditable() method, which it seems didn't work. I guessed the problem is the persistence connection between my Table and database.
How can I solve it? Any example? I just googled the web and can't find example which use netbean combined with database. I know that a single JTable would work when creating your own model.
thx.I know what coding i did, Yes u r right but im new to GUI programming only,
That's why i posted it to forums, I gone through the Control Flow Statements link what u have given.
U didnt get my question at all.
Again the problem im facing is the table is already displayed with 2nd column uneditable.
When some Action done on table, i need to make 2nd column editable at run time.
Thanks if u provide me the solution instead of deciding what type of programmer im. -
Problem when setting JTable cell color.
hello,
when I setting color for particular table cell, it sets.
but, when I click another row (another cell) , the color of the previous cell disabled and it visible only when I click that cells row.
how can I permanatly set the color for the rows depends on input data.
for example,
if a device is connected, I want to give the cell color GREEN.
if device is not connected , i want to give the color as RED.
thank you.but, when I click another row (another cell) , the color of the previous cell disabled and it visible only when I click that cells row.It appears you applied color to cell editor.
tableObj.getComponentAt(x,y).setForeground(Color.red);
tableObj.getComponentAt(x,y).setBackground(Color.red); or could be solved properl if you post the code
Maybe you are looking for
-
Jabber Client CallerId displays wrong name
Hi, I have a problem with the wrong name displaying in Jabber calls. This only occurs when John calls from his Jabber Client. There is always the CallerId of Sam showing up. Checked AD, Outlook contacts, CUCM & Webex configuration and found no errors
-
How do I share files between a PowerPC 8100 OS 7.6.1 and an iMac OS 10.7.4 over peer to peer ethernet connection? I'm trying to get data off the old machine so I can retire it for good. Can I just save the data and worry about file conversion later?
-
Fetching full folder URL in Powershell
Hi, I am trying to upload some images to a sub-folder in a library. However, the folder path does not seem to be correct, and the image is not getting added. The actual url will be : http://server/Lists/LibraryName/subfolder But when using the powers
-
CHARM : Sequence of transport request to import
Hi, I'm configuring CHARM and found out below issue. Scenario. 1) Charm project with project type implementation was created in SOLMAN. The type of change is normal correction. All transport request was created under 1 task plan. The transport was cr
-
Strange thing happened with the screen
I've had my Mac Pro for more almost 18 months. Today I was in a site and I leave my desk for a moment, when I return the screen was distorted, the colors, like when you zoom in a pic and you see the pixels.... I press the button and it restarted norm