Editable JTextField in JTable

Hi,
My table has 4 columns and n number of rows (coming from Database), one of them is Editable column. I have a JTextField in Editable Column. I want to save changes to database when user is finish editing that column. the way I am saving all data is when user presses "Save" I read all data from Jtable editable column, and save changes. Only problem is that which ever row was user working on last...changes are not registered...for changes to be registerd..user have to select different row..then and only then last working cell/row data gets saved. How do i make sure that all changes are registerd when user presses "save".
to get value at editable jtextfield column i am using...
int row = myJTable.getSelectedRow();
Object jtf_Value = (CustomModel) myJTable.getModel().getValueAt(row, 1);
by this method, jtf_value returns data before any editing.. (Editiing cell shows new edited value...
ex. if I edited that column..with 'test data 123'
and before eidition value was 'testing'
jtf_Value returns 'testing' Not 'test data 123'
thank for help in advance.

The DataModel isn't updated until focus is moved to a different cell. To force updating of the DataModel add the following code at the start of your Save action:
if ( table.isEditing() )
     int row = table.getEditingRow();
     int col = table.getEditingColumn();
     table.getCellEditor(row, col).stopCellEditing();
}

Similar Messages

  • Editable JComboBox in JTable

    There is a bug in Jdk1.5 (bug#4684090) - When TAB out from Editable Jcombobox in JTable, the focus is moved to outside JTable instead of next cell.
    What is the best workaround for thsi bug.
    Thanks,
    VJ

    I was using java 1.5.0_06 in my application and I had this problem
    When I upgraded to java 1.6.0_01, I no longer had this issue.
    This seems to be a bug in 1.5 version of Java that has been fixed in 1.6
    thanks,

  • Keypressed event for a particular  edited cell of jtable

    hi friend,
    how to write the key pressed event for the edited cell of jtable which having focus on that particular cell.
    pls help me out.

    [http://catb.org/~esr/faqs/smart-questions.html]
    [http://mindprod.com/jgloss/sscce.html]
    db

  • Using KeyMap in Editable JComboBoxes and JTable

    I am using Keymapping for JTextFields. It works fine ! I am interested in extending the keymap feature to JComboBoxes and JTable.

    if you want to do the keymapping inside the editable component of the combobox or the table, make sure you apply it on the editor component.e.g. comboBox.getEditor().getEditorComponent() and table.getCellEditor().getTableCellEditorComponent().

  • Date editing in a JTable

    Hello,
    whereas a JFormattedTextField with a mask formatter can be used as editor in a
    JTable just like in a container, a JFormattedTextField with a date formatter
    obviously cannot. The tutorial warns us that table cells are NOT components,
    but in what cases do we have to care?
    I also understand the tutorial in the way that while editing, the editor is
    responsible for displaying the cell, and the cell renderer takes over again
    when editing is stopped. Is that right? If yes, I would not have to care for
    a special renderer, for I'm quite happy with the default one.
    I'm trying to use a JFormattedTextField which would, if working, need only
    little code, for the solutions I found in the net are quite expanded.
    The code below is in many ways defective:
    1) Without renderer
    When editing of the date column starts, the date is displayed in the
    "dow mon dd hh:mm:ss zzz yyyy" form, and doesn't revert even when no edits
    are performed. This doesn't happen if the JFormattedTextField is used
    outside a table.
    2) With renderer
    The value arrives in the renderer sometimes as Object, sometimes as String
    (I suppose the editor is responsible for that.)
    But before I pursue this approach I would like to ask you, whether you
    generally discourge using a JFormattedTextField in a date column.
    If not, please comment my understanding and direct me to a solution.
    import java.awt.*;
    import java.text.*; // ParseException
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*; // MaskFormatter
    import javax.swing.table.*;
    public class FTFTable extends JFrame {
      public FTFTable() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(200, 200);
        setTitle("FTFTable");
        Container cp = getContentPane();
        String headers[] = {"Date", "Mask: #-##"};
        DateFormat format= new SimpleDateFormat("dd.MM.yyyy");
        DateFormatter df= new DateFormatter(format);
        JFormattedTextField ftfDate= new JFormattedTextField(df);
        MaskFormatter mf1= null;
        try {
          mf1= new MaskFormatter("#-##");
          mf1.setPlaceholderCharacter('_');
        catch (ParseException e) {
          System.out.println(e);
        JFormattedTextField ftf= new JFormattedTextField(mf1);
        final DefaultTableModel dtm= createTableModel(headers);
        dtm.addRow(new Object[]{new java.util.Date(), "1-23"});
        JTable table= new JTable(dtm);
        DefaultTableColumnModel dcm=(DefaultTableColumnModel)table.getColumnModel
    //  Use custom editors
        dcm.getColumn(0).setCellEditor(new DefaultCellEditor(ftfDate));
    //    dcm.getColumn(0).setCellRenderer(new MyDateRenderer());
        dcm.getColumn(1).setCellEditor(new DefaultCellEditor(ftf));
        JScrollPane scrollPane = new JScrollPane(table);
        cp.add(scrollPane, BorderLayout.CENTER);
        setVisible(true);
      public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
          public void run() {
         new FTFTable();
      private DefaultTableModel createTableModel(Object[] columnNames) {
        DefaultTableModel tblModel= new DefaultTableModel(columnNames, 0) {
          public Class getColumnClass(int column) {
         Class returnValue;
         if (column>=0 && column<getColumnCount()) {
           returnValue= getValueAt(0, column).getClass();
         else {
           returnValue= Object.class;
         return returnValue;
        return tblModel;
      class MyDateRenderer extends DefaultTableCellRenderer {
        DateFormat format;
        public MyDateRenderer() {
          super();
          format= new SimpleDateFormat("dd.MM.yyyy");
        public void setValue(Object value) {
          if (value instanceof String) System.out.println("Is String");
          if (value instanceof Object) System.out.println("Is Object");
          System.out.println(value);
          System.out.println(format.format(value)); // Crashes if String
          setText((value == null) ? "" : format.format(value));
    }

    Thanks Rob, that was helpful advice.
    If one needs the date displayed only in the form of one's own locale, there's
    no need to implement a cell renderer. Using a JFormattedTextField provides the
    additional facility of using the arrow keys to modify days, months or year.
    import java.awt.*;
    import java.text.*; // ParseException
    import java.util.*;
    import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.event.*;
    import javax.swing.text.*; // MaskFormatter
    import javax.swing.table.*;
    public class FTFTable extends JFrame {
      public FTFTable() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(200, 200);
        setTitle("FTFTable");
        Container cp = getContentPane();
        String headers[] = {"Date", "Mask: #-##"};
        MaskFormatter mf1= null;
        try {
          mf1= new MaskFormatter("#-##");
          mf1.setPlaceholderCharacter('_');
        catch (ParseException e) {
          System.out.println(e);
        JFormattedTextField ftf= new JFormattedTextField(mf1);
        DefaultTableModel dtm= createTableModel(headers);
        dtm.addRow(new Object[]{new Date(), "1-23"});
        JTable table= new JTable(dtm);
    //    Locale.setDefault(Locale.FRANCE);
    //  Use custom editors
        table.setDefaultEditor(Date.class, new DateEditorSupply().getEditor());
        DefaultTableColumnModel dcm=(DefaultTableColumnModel)table.getColumnModel();
        dcm.getColumn(1).setCellEditor(new DefaultCellEditor(ftf));
        JScrollPane scrollPane = new JScrollPane(table);
        cp.add(scrollPane, BorderLayout.CENTER);
        setVisible(true);
      public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
          public void run() {
         new FTFTable();
      private DefaultTableModel createTableModel(Object[] columnNames) {
        DefaultTableModel tblModel= new DefaultTableModel(columnNames, 0) {
          public Class getColumnClass(int column) {
         Class returnValue;
         if (column>=0 && column<getColumnCount()) {
           returnValue= getValueAt(0, column).getClass();
         else {
           returnValue= Object.class;
         return returnValue;
        return tblModel;
      public class DateEditorSupply {
        DateEditor editor;
        SimpleDateFormat format;
        public DateEditorSupply() {
    //     To be modified according to the locale's default.
    //      this("dd MMM yyyy"); // FRANCE
    //      this("dd.MM.yyyy"); // GERMANY
          this("dd-MMM-yyyy"); // UK
    //      this("MMM d, yyyy"); // US
    //Currently this constructor can only be used with the locale's default pattern.
    // If you need various patterns, you have to implement a cell renderer as well.
        public DateEditorSupply(String pattern) {
          format= new SimpleDateFormat(pattern);
          format.setLenient(false);
          editor= new DateEditor();
        public DefaultCellEditor getEditor() {
          return editor;
        private class DateEditor extends DefaultCellEditor {
          public DateEditor() {
         super(new JFormattedTextField(new DateFormatter(format)));
          @Override
          public Object getCellEditorValue() {
         try {
           java.sql.Date value= new java.sql.Date(format.parse(
                   ((JTextField)getComponent()).getText()).getTime());
           return value;
         catch (ParseException ex) {
           return null;
          @Override
          public Component getTableCellEditorComponent(
              final JTable table, final Object value,
              final boolean isSelected, final int row, final int column) {
         JTextField tf= ((JTextField)getComponent());
         tf.setBorder(new LineBorder(Color.black));
         try {
           tf.setText(format.format(value));
         catch (Exception e) {
           tf.setText("");
         return tf;
          public boolean parseDate(String value) {
         ParsePosition pos= new ParsePosition(0);
         format.parse(value, pos); // updates pos.
         if (pos.getIndex()!=value.length() ||
             format.getCalendar().get(Calendar.YEAR)>2500) return false;
         return true;
          @Override
          public boolean stopCellEditing() {
         String value = ((JTextField)getComponent()).getText();
         if (!value.equals("")) {
    /*       This code would accept alphabetic characters within or at the end of
    //       the year in a dd.MM.yyyy pattern, as well as more than 4-digits in the
    //       year string.
           try {
             format.parse(value);
           catch (ParseException e) {
             ((JComponent)getComponent()).setBorder(new LineBorder(Color.red));
             return false;
           We avoid this in using "parseDate(value)" instead.
           if (!parseDate(value)) {
             ((JComponent)getComponent()).setBorder(new LineBorder(Color.red));
             return false;
         return super.stopCellEditing();
        } // end DateEditor
    }Thanks to André for sharing his .
    Edited by: Joerg22 on 03.07.2010 14:11
    I made some changes to the DateEditorSupply class, so that the code can easily be used when storing the table date in a database.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   

  • How can I use JTextField as JTable cell editor while using AbstractTableMod

    I use this code but can not edit field
    import javax.swing.table.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.awt.*;
    import javax.swing.text.*;
    public class Main extends JFrame {
    JTable table;
    MyTableModel tableModel;
    public Main() {
    super("Colored JTable Demonstration");
    tableModel = new MyTableModel(10, 5);
    table = new JTable(tableModel);
    DefaultTableCellRenderer colorRenderer = new DefaultTableCellRenderer() {
    public void setValue(Object value) {
    if (value instanceof ColoredItem) {
    Color fcolor = ((ColoredItem) value).getForeground();
    Color bcolor = ((ColoredItem) value).getBackground();
    this.setForeground(fcolor);
    this.setBackground(bcolor);
    setText(((ColoredItem) value).getValue());
    table.setDefaultRenderer(Object.class, colorRenderer);
    //table.setDefaultEditor(Object.class, new DefaultCellEditor(new JTextField()));
    //Set up real input validation for the integer column.
    TableCellEditor editor = new DefaultCellEditor(new JTextField()) {
    public Component getTableCellEditorComponent(JTable table,
    Object value, boolean isSelected, int row, int column) {
    super.getTableCellEditorComponent(table, value, isSelected,row, column);
    JTextField myField = (JTextField) getComponent();
    //myField.setDocument(new ValidDocument());
    return myField;
    //if(value==null) return null;
    //return null;
    int numbercolumn = table.getColumnCount();
    for(int i = 0; i< numbercolumn ; i++){
    table.getColumnModel().getColumn(i).setCellEditor(editor);
    // table.getColumnModel().getColumn(i).setCellRenderer(new ColorRenderer());
    //table.validate();
    JScrollPane scrollPane = new JScrollPane(table);
    getContentPane().add(scrollPane, BorderLayout.CENTER);
    JPanel radioPanel = new JPanel(new GridLayout(1, 5));
    JRadioButton redRadio = new JRadioButton("Red");
    JRadioButton greenRadio = new JRadioButton("Green");
    JRadioButton blueRadio = new JRadioButton("Blue");
    JRadioButton yellowRadio = new JRadioButton("Yellow");
    JRadioButton blackRadio = new JRadioButton("Black");
    // Group the radio buttons.
    ButtonGroup group = new ButtonGroup();
    group.add(redRadio);
    group.add(greenRadio);
    group.add(blueRadio);
    group.add(yellowRadio);
    group.add(blackRadio);
    radioPanel.add(redRadio);
    radioPanel.add(greenRadio);
    radioPanel.add(blueRadio);
    radioPanel.add(yellowRadio);
    radioPanel.add(blackRadio);
    RadioListener radioListener = new RadioListener();
    redRadio.addActionListener(radioListener);
    greenRadio.addActionListener(radioListener);
    blueRadio.addActionListener(radioListener);
    yellowRadio.addActionListener(radioListener);
    blackRadio.addActionListener(radioListener);
    // add radiopanel to container
    JPanel panel = new JPanel(new GridLayout(2, 1));
    panel.add(new JLabel("Select color for selected cell:"));
    panel.add(radioPanel);
    getContentPane().add(BorderLayout.SOUTH, panel);
    addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    class ValidDocument extends PlainDocument {
    public void insertString(int index, String s, AttributeSet a)
    throws BadLocationException {
    if ((s == null) || (s.length() == 0)) {
    return;
    StringBuffer t = new StringBuffer(getLength() + s.length());
    t.append(getText(0, index));
    t.append(s);
    t.append(getText(index, getLength() - index));
    if(s.equals("1") && t.toString().equals("1")){               
    super.insertString(index, s, a);
    if(s.equals("0") && t.toString().equals("0")){
    super.insertString(index, s, a);
    if(s.equals(".") && t.toString().equals("0.")){
    super.insertString(index, s, a);
    if(s.equals("5") && t.toString().equals("0.5")){
    super.insertString(index, s, a);
    if(s.equals("b") && t.toString().equals("b")){
    super.insertString(index, s, a);
    //if (super instanceof ColoredItem) {
    // Color fcolor = ((ColoredItem) value).getForeground();
    // Color bcolor = ((ColoredItem) value).getBackground();
    // this.setForeground(fcolor);
    // this.setBackground(bcolor);
    //super.setText(t.toString());
    System.out.println("hehe");
    class RadioListener implements ActionListener {
    public void actionPerformed(ActionEvent ae) {
    int row = table.getSelectedRow();
    int column = table.getSelectedColumn();
    ColoredItem ci = (ColoredItem) tableModel.getValueAt(row, column);
    if (ae.getActionCommand().equals("Red"))
    ci.setBackground(Color.red);
    else if (ae.getActionCommand().equals("Green"))
    ci.setBackground(Color.green);
    else if (ae.getActionCommand().equals("Blue"))
    ci.setBackground(Color.blue);
    else if (ae.getActionCommand().equals("Yellow"))
    ci.setBackground(Color.yellow);
    else if (ae.getActionCommand().equals("Black"))
    ci.setBackground(Color.black);
    System.out.println(ci.getValue());
    // necessary to cause a fireTableCellUpdated event
    tableModel.setValueAt(ci, row, column);
    private class ColoredItem {
    private String value;
    private Color foreground;
    private Color background;
    public ColoredItem(String value, Color foreground, Color background) {
    this.value = value;
    this.foreground = foreground;
    this.background = background;
    public void setValue(String value) {
    this.value = value;
    public void setForeground(Color foreground) {
    this.foreground = foreground;
    public void setBackground(Color background) {
    this.background = background;
    public String getValue() {
    return value;
    public Color getForeground() {
    return foreground;
    public Color getBackground() {
    return background;
    class MyTableModel extends AbstractTableModel {
    String [] columnNames;
    ColoredItem [][] data;
    MyTableModel(int rows, int columns) {
    columnNames = createColumnElements(columns);
    data = createTableElements(rows, columns);
    public int getColumnCount() {
    return columnNames.length;
    public int getRowCount() {
    return data.length;
    public String getColumnName(int col) {
    return columnNames[col];
    public Object getValueAt(int row, int col) {
    return data[row][col];
    public Class getColumnClass(int c) {
    return getValueAt(0, c).getClass();
    public void setValueAt(ColoredItem value, int row, int col) {              
    data[row][col] = value;
    //System.out.println((ColoredItem)value.getValue());
    //temp.setValue((ColoredItem)value.getValue());
    fireTableCellUpdated(row, col);
    private String[] createColumnElements(int columns) {
    String[] data;
    data = new String[columns];
    for (int i=0; i<columns; i++) {
    data[i] = new String("Column " + i);
    return data;
    private ColoredItem [][] createTableElements(int rows, int columns) {
    ColoredItem [][]data;
    data = new ColoredItem[rows][];
    for (int i=0; i<rows; i++) {
    data[i] = new ColoredItem[columns];
    for (int j=0; j<columns; j++) {
    data[i][j] = new ColoredItem("", Color.black, Color.white);
    return data;
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    return true;
    public static void main(String []args) {
    Main main = new Main();
    main.pack();
    main.setVisible(true);
    }

    JTextField jtxf=new JTextField();
         private void setColumns() {
    TableColumn column = null;
    if(this.getRowCount()>0){
    for (int i = 0; i < this.getColumnCount(); i++) {
    column = this.getColumnModel().getColumn(i);
              DefaultCellEditor dce = new DefaultCellEditor(jtxf);
              column.setCellEditor(dce);
              dce.setClickCountToStart(1);
    simply call this method in constructor it will help u

  • Stopping cell editing in a JTable using a JComboBox editor w/ AutoComplete

    Hi there! Me again with more questions!
    I'm trying to figure out the finer parts of JTable navigation and editing controls. It's getting a bit confusing. The main problem I'm trying to solve is how to make a JTable using a combo box editor stop editing by hitting the 'enter' key in the same fashion as a JTextField editor. This is no regular DefaultCellEditor though -- it's one that uses the SwingX AutoCompleteDecorator. I have an SSCCE that demonstrates the issue:
    import java.awt.Component;
    import java.awt.EventQueue;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JTable;
    import javax.swing.WindowConstants;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableModel;
    import org.jdesktop.swingx.autocomplete.AutoCompleteDecorator;
    public class AutoCompleteCellEditorTest extends JFrame {
      public AutoCompleteCellEditorTest() {
        JTable table = new JTable();
        Object[] items = {"A", "B", "C", "D"};
        TableModel tableModel = new DefaultTableModel(2, 2);
        table.setModel(tableModel);
        table.getColumnModel().getColumn(0).setCellEditor(new ComboCellEditor(items));
        getContentPane().add(table);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
      private class ComboCellEditor extends AbstractCellEditor implements TableCellEditor {
        private JComboBox comboBox;
        public ComboCellEditor(Object[] items) {
          this.comboBox = new JComboBox(items);
          AutoCompleteDecorator.decorate(this.comboBox);
        public Object getCellEditorValue() {
          return this.comboBox.getSelectedItem();
        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
          comboBox.setSelectedItem(value);
          return comboBox;
      public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
          public void run() {
            new AutoCompleteCellEditorTest().setVisible(true);
    }Problem 1: Starting to 'type' into the AutoCompleteDecorate combo box doesn't cause it to start editing. You have to hit F2, it would appear. I've also noticed this behaviour with other JComboBox editors. Ideally that would be fixed too. Not sure how to do this one.
    Problem 2: After editing has started (say, with the F2 key), you may start typing. If you type one of A, B, C, or D, the item appears. That's all good. Then you try to 'complete' the edit by hitting the 'enter' key... and nothing happens. The 'tab' key works, but it puts you to the next cell. I would like to make the 'enter' key stop editing, and stay in the current cell.
    I found some stuff online suggesting you take the input map of the table and set the Enter key so that it does the same thing as tab. Even though that's not exactly what I desired (I wanted the same cell to be active), it didn't work anyway.
    I also tried setting a property on the JComboBox that says that it's a table cell editor combo box (just like the DefaultCellEditor), but that didn't work either. I think the reason that fails is because the AutoCompleteDecorator sets isEditable to true, and that seems to stop the enter key from doing anything.
    After tracing endless paths through processKeyBindings calls, I'm not sure I'm any closer to a solution. I feel like this should be a fairly straightforward thing but I'm having a fair amount of difficulty with it.
    Thanks for any direction you can provide!

    Hi Jeanette,
    Thanks for your advice. I looked again at the DefaultCellEditor. You are correct that I am not firing messages for fireEditingStopped() and fireEditingCancelled(). Initially I had copied the behaviour from DefaultCellEditor but had trimmed it out. I assumed that since I was extending AbstractCellEditor and it has them implemented correctly that I was OK. But I guess that's not the case! The problem I'm having with implementing the Enter key stopping the editing is that:
    1) The DefaultCellEditor stops cell editing on any actionPerformed. Based on my tests, actionPerformed gets called whenever a single key gets pressed. I don't want to end the editing on the AutoCompleteDecorated box immediately -- I'd like to wait until the user is happy with his or her selection and has hit 'Enter' before ending cell editing. Thus, ending cell editing within the actionPerformed listener on the JComboBox (or JXComboBox, as I've made it now) will not work. As soon as you type a single key, if it is valid, the editing ends immediately.
    2) I tried to add a key listener to the combo box to pick up on the 'Enter' key and end the editing there. However, it appears that the combo box does not receive the key strokes. I guess they're going to the AutoCompleteDecorator and being consumed there so the combo box does not receive them. If I could pick up on the 'Enter' key there, then that would work too.
    I did more reading about input maps and action maps last night. Although informative, I'm not sure how far it got me with this problem because if the text field in the AutoCompleteDecorator takes the keystroke, I'm not sure how I'm going to find out about it in the combo box.
    By the way, when you said 'They are fixed... in a recent version of SwingX', does that mean 1.6.2? That's what I'm using.
    Thanks!
    P.S. - Maybe I should create a new question for this? I wanted to mark your answer as helpful but I already closed the thread by marking the answer to the first part as correct. Sorry!
    Edited by: aardvarkk on Jan 27, 2011 7:41 AM - Added SwingX versioning question.

  • Directly enter edit mode of JTable cell

    Hi Everyone,
    On my UI, i am showing editable JTable. When I click on table's row / cell, it selects the row. Fine.
    But I want that it should directly enter edit mode of cell and the whole text is to be selected and highlighted and focussed.
    Thus, user can directly type the new text.
    Please suggest correct approach to handle this scenario.
    Thanks in advance.
    Girish Varde.

    Here is my attempt at solving this problem:
    **  For text selection you have two choices. Remove the "xxx" from either
    **  editCellAt() or prepareEditor() method.
    **  The difference is in how mouse double clicking works
    **  To place a cell directly into edit mode, use the changeSelection() method.
    **  Be aware this will generate a TableModelEvent every time you leave a cell.
    **  You can also use either of the above text selection methods.
    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.text.*;
    import javax.swing.table.*;
    public class TableEditCell extends JFrame
         public TableEditCell()
              String[] columnNames = {"Number", "Letter"};
              Object[][] data = { {"1", "A"}, {"2", "B"}, {"3", "C"} };
              JTable table = new JTable(data, columnNames)
                   //  Place cell in edit mode when it 'gains focus'
                   public void xxxchangeSelection(
                        int row, int column, boolean toggle, boolean extend)
                        super.changeSelection(row, column, toggle, extend);
                        if (editCellAt(row, column))
                             getEditorComponent().requestFocusInWindow();
                   //  Select the text when the cell starts editing
                   //  a) text will be replaced when you start typing in a cell
                   //  b) text will be selected when you use F2 to start editing
                   //  c) text will be selected when double clicking to start editing
                   public boolean xxxeditCellAt(int row, int column, EventObject e)
                        boolean result = super.editCellAt(row, column, e);
                        final Component editor = getEditorComponent();
                        if (editor != null && editor instanceof JTextComponent)
                             if (e == null)
                                  ((JTextComponent)editor).selectAll();
                             else
                                  SwingUtilities.invokeLater(new Runnable()
                                       public void run()
                                            ((JTextComponent)editor).selectAll();
                        return result;
                   //  Select the text when the cell starts editing
                   //  a) text will be replaced when you start typing in a cell
                   //  b) text will be selected when you use F2 to start editing
                   //  c) caret is placed at end of text when double clicking to start editing
                   public Component xxxprepareEditor(
                        TableCellEditor editor, int row, int column)
                        Component c = super.prepareEditor(editor, row, column);
                        if (c instanceof JTextComponent)
                             ((JTextField)c).selectAll();
                        return c;
              JScrollPane scrollPane = new JScrollPane( table );
              getContentPane().add( scrollPane );
         public static void main(String[] args)
              TableEditCell frame = new TableEditCell();
              frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
              frame.pack();
              frame.setLocationRelativeTo( null );
              frame.setVisible(true);
    }

  • Tabbing editable fields in JTable

    {noformat}{noformat}HI All,
    I'd like to be able to tab between cells and the cell to immediately go into edit mode. Additionally I'd like it to
    skip uneditable cells, so tabbing on a far right cell doesn't move to the label on the
    next row, but to the next editable cell in the next row. This code was posted in a different newsgroup and it works mostly.
    It does not tab to the next editable cell in the next row. The focus is back to the first editable column in the same row.
    How do I make it go the next row.? The getSelectedRow() method always returns the first selected row.
    Any suggestions or help is appreciated.
    bq. {noformat} import javax.swing.*; \\ import javax.swing.border.Border; \\ import javax.swing.border.EmptyBorder; \\ import javax.swing.table.TableCellRenderer; \\ import javax.swing.table.DefaultTableCellRenderer; \\ import javax.swing.table.DefaultTableModel; \\ import java.awt.*; \\ public class TableTest extends JFrame { \\ public TableTest() \\ { \\ getContentPane().add(new MyTable()); \\ } \\ public static void main(String[] args) \\ { \\ TableTest frame = new TableTest(); \\ frame.setDefaultCloseOperation(EXIT_ON_CLOSE); \\ frame.pack(); \\ frame.setVisible(true); \\ } \\ public class MyTable extends JTable \\ { \\ public MyTable() \\ { \\ super(new MyTableModel()); \\ putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); \\ setDefaultRenderer(String.class, new Renderer()); \\ DefaultCellEditor dce = new DefaultCellEditor(new JTextField()); \\ dce.setClickCountToStart(1); \\ setDefaultEditor(String.class, dce); \\ setOpaque(false); \\ setShowGrid(false);{noformat}{noformat}     configure(); \\ } \\ {noformat}{noformat}     private void configure() \\ { \\ setSelectionMode(ListSelectionModel.SINGLE_SELECTION); \\ setCellSelectionEnabled(true); \\ // Add SelectionListeners to track selection changes \\ // across columns. \\ getColumnModel().getSelectionModel().addListSelectionListener( \\ new ExploreSelectionListener()); \\ } \\ private class ExploreSelectionListener implements ListSelectionListener \\ { \\ public void valueChanged(ListSelectionEvent e) \\ { \\ if(!e.getValueIsAdjusting()) \\ { \\ int row = getSelectedRow(); \\ int col = getSelectedColumn(); \\ // Make sure we start with legal values. \\ while(col < 0) col++; \\ while(row < 0) row++; \\ // Find the next editable cell. \\ while(!isCellEditable(row, col)) \\ { \\ col++; \\ if(col > getColumnCount()-1) \\ { \\ col = 1; \\ row = (row == getRowCount()-1) ? 1 : row+1; \\ } \\ } \\ // Select the cell in the table. \\ final int r = row, c = col; \\ EventQueue.invokeLater(new Runnable() \\ { \\ public void run() \\ { \\ changeSelection(r, c, false, false); \\ } \\ }); \\ // Edit. \\ if(isCellEditable(row, col)) \\ { \\ editCellAt(row, col); \\ ((JTextField)editorComp).selectAll(); \\ editorComp.requestFocusInWindow(); \\ } \\ } \\ } \\ } \\ private class Renderer implements TableCellRenderer \\ { \\ DefaultTableCellRenderer renderer; \\ JTextField textField; \\ protected Border border = new EmptyBorder(1, 1, 1, 1); \\ public Renderer() \\ { \\ renderer = new DefaultTableCellRenderer(); \\ textField = new JTextField(); \\ textField.setHorizontalAlignment(SwingConstants.RIGHT); \\ } \\ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) \\ { \\ if (!isCellEditable(row, column)) \\ { \\ renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); \\ renderer.setHorizontalAlignment(column == 0 ? SwingConstants.LEFT : SwingConstants.RIGHT); \\ renderer.setBackground(Color.GRAY.brighter()); \\ renderer.setOpaque(false); \\ renderer.setFont(table.getFont().deriveFont(9f).deriveFont(Font.BOLD)); \\ renderer.setForeground(Color.BLACK); \\ renderer.setBorder(border); \\ return renderer; \\ } \\ textField.setText(value.toString()); \\ return textField; \\ } \\ } \\ } \\ class MyTableModel extends DefaultTableModel \\ { \\ String[][] data = new String[][] \\ { \\ {"", "col 1", "col 2"}, \\ {"row 1", "1", "2"}, \\ {"row 2", "3", "4"}, \\ {"row 3", "5", "6"}, \\ }; \\ public MyTableModel() \\ { \\ } \\ public int getRowCount() \\ { \\ return 4; \\ } \\ public int getColumnCount() \\ { \\ return 3; \\ } \\ public Object getValueAt(int row, int column) \\ { \\ return data[row][column]; \\ } \\ public boolean isCellEditable(int row, int column) \\ { \\ return row != 0 && column != 0; \\ } \\ public Class getColumnClass(int column) \\ { \\ return String.class; \\ }{noformat}{noformat} {noformat}{noformat}     public void setValueAt(Object value, int row, int column) \\ { \\ data[row][column] = value.toString(); \\ } \\ } \\ } \\ {noformat}
    {noformat}
    {noformat}

    Thanks for the suggestion. I noticed that too - too late, had already posted the question.
    I need to be able to tab only the editable cells in the table. When I reach the end of the row, tab should focus the first editable cell in the next row.
    This code works fine if I remove the last column. However, I need it to work with editable and non-editable fields in a table.
    Here is the correct formatted code.
    import javax.swing.*;
    import javax.swing.border.Border;
    import javax.swing.border.EmptyBorder;
    import javax.swing.table.TableCellRenderer;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.event.ListSelectionEvent;
    import java.awt.*;
    public class TableTest extends JFrame {
         public TableTest()
              getContentPane().add(new MyTable());
         public static void main(String[] args)
              TableTest frame = new TableTest();
              frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
              frame.pack();
              frame.setVisible(true);
        public class MyTable extends JTable
            public MyTable()
                super(new MyTableModel());
                putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
                setDefaultRenderer(String.class, new Renderer());
                DefaultCellEditor dce = new DefaultCellEditor(new JTextField());
                dce.setClickCountToStart(1);
                setDefaultEditor(String.class, dce);
                setOpaque(false);
                setShowGrid(false);
                configure();
                        private void configure()
                setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                setCellSelectionEnabled(true);
                // Add SelectionListeners to track selection changes
                // across columns.
                getColumnModel().getSelectionModel().addListSelectionListener(
                            new ExploreSelectionListener());
            // Add this class to the body of MyTable class.
            private class ExploreSelectionListener implements ListSelectionListener
                public void valueChanged(ListSelectionEvent e)
                    if(!e.getValueIsAdjusting())
                        int row = getSelectedRow();
                        int col = getSelectedColumn();
                                                 // Make sure we start with legal values.
                        while(col < 0) col++;
                        while(row < 0) row++;
                        // Find the next editable cell.
                        while(!isCellEditable(row, col))
                            col++;
                            if(col > getColumnCount()-1)
                                col = 1;
                                row = (row == getRowCount()-1) ? 1 : row+1;
                        // Select the cell in the table.
                        final int r = row, c = col;
                        EventQueue.invokeLater(new Runnable()
                            public void run()
                                changeSelection(r, c, false, false);
                        // Edit.
                        if(isCellEditable(row, col))
                            editCellAt(row, col);
                            ((JTextField)editorComp).selectAll();
                            editorComp.requestFocusInWindow();
            private class Renderer implements TableCellRenderer
                DefaultTableCellRenderer renderer;
                JTextField textField;
                protected Border border = new EmptyBorder(1, 1, 1, 1);
                public Renderer()
                    renderer = new DefaultTableCellRenderer();
                    textField = new JTextField();
                    textField.setHorizontalAlignment(SwingConstants.RIGHT);
                public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
                    if (!isCellEditable(row, column))
                        renderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                        renderer.setHorizontalAlignment(column == 0 ? SwingConstants.LEFT : SwingConstants.RIGHT);
                        renderer.setBackground(Color.GRAY.brighter());
                        renderer.setOpaque(false);
                        renderer.setFont(table.getFont().deriveFont(9f).deriveFont(Font.BOLD));
                        renderer.setForeground(Color.BLACK);
                        renderer.setBorder(border);
                        return renderer;
                    textField.setText(value.toString());
                    return textField;
        class MyTableModel extends DefaultTableModel
            String[][] data = new String[][]
                            {"", "col 1", "col 2", ""},
                            {"row 1", "1", "2", "end1"},
                            {"row 2", "3", "4", "end2"},
                            {"row 3", "5", "6", "end3"}
            public MyTableModel()
                        public void setValueAt(Object value, int row, int column)
                data[row][column] = value.toString();
            public int getRowCount()
                return 4;
            public int getColumnCount()
                return 4;
            public Object getValueAt(int row, int column)
                return data[row][column];
            public boolean isCellEditable(int row, int column)
                return  row != 0 && (column != 0 && column != 3);
                        public Class getColumnClass(int column)
                return String.class;
    }

  • Detecting mouse clicks in editable cell of JTable

    Hi everyone :)
    I thought that this question might have been asked before, but I have searched the forums extensively and have not been able to find the solution.
    What I want to achieve is to detect single and double mouse clicks on JTable cells (that are editable).
    For example, I have a JTable and there exists within it an editable cell. If the user clicks on it once then that cell goes into edit mode, and the user can type directly into the cell. I have already successfully implemented this.
    However, what I also want to do is detect a double-click so that I can pop up a dilaog that shows a list of default values that the user can select.
    So here is what I want;
    1. User clicks on the cell once.
    2. Cell moves into edit mode.
    3. If the user clicks again within a certain time interval then cancel edit mode and pop up a dialog containing values that the user can select from.
    I think that to do this I need to be able to detect mouse clicks on the cell that is currently being edited. So far I have been unable to discover how this is done. I have even tried extending JTextField to get what I want, but with no luck.
    Any help would be greatly appreciated.
    Kind regards,
    Ben Deany

    Thanks for the reply.
    Unfortunately, it is not possible to call 'AddMouseListener()' on a cell editor. You are only able to call 'addCellEditorListener()' and that only allows two events to the broadcast (edit cancel, and edit stop).
    Ben

  • Needs double click to edit cell in JTable

    I know this is bad design but there's no other way that I could possibly meet the requirement which is to have dynamic components. Anyhow, the requirement is to have any kind of components(e.g. TextFields, Combobox, Regular expression fields, a panel with a number of checkboxes) in a table cell in the same column. It would have been easier to do this by using the the DefaultCellEditor, with the 'panel containing a number of checkboxes' I cannot use it.
    I already have an implementation for this requirement. There was no problem with it when we used Java 1.5. But when we shifted to Java 1.6, I noticed that I need to double-click on a cell so that I can edit it. I did not notice this behavior at all with 1.5. What could have changed in 1.6?
    Below, are my (trimmed-down) codes:
    //TestComponent.java
    public class TestComponent extends JPanel{
    private int componentHeight=16;
    public TestComponent(int i){
    this.setPreferredSize(new Dimension(90, this.componentHeight));
    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
    switch (i){
    case 0: createTextField(); break;
    case 1: createCheckBox(); break;
    case 2: createCombo(); break;
    private void createTextField(){
    String text = null;
    int textFieldMaxLength = 5;
    JTextField oText = new JTextField(textFieldMaxLength);
    // add it to this Panel:
    this.add(oText);
    // set the data:
    text = "test";
    oText.setText(text);
    // set size for this TextField:
    Dimension fieldSize = new Dimension(
    textFieldMaxLength * 13, this.componentHeight);
              oText.setPreferredSize(fieldSize);
              oText.setMinimumSize(fieldSize);
              oText.setMaximumSize(fieldSize);     
    private void createCheckBox(){
    JCheckBox chkbox = new JCheckBox();
    this.add(chkbox);
    private void createCombo(){
    JComboBox combo = new JComboBox(new String[]{"apple", "orange", "plum", "grapefruit"});
    Dimension fieldSize = new Dimension(                    5 * 13, this.componentHeight);
              combo.setPreferredSize(fieldSize);
              combo.setMinimumSize(fieldSize);
              combo.setMaximumSize(fieldSize);
    this.add(combo);
    //ComponentCellEditor.java
    public class ComponentCellEditor extends AbstractCellEditor
         implements TableCellEditor, Serializable{
    protected JComponent editorComponent = null;     
    public Component getComponent() {
    return editorComponent;
    public Object getCellEditorValue() {
    return editorComponent;
    public boolean isCellEditable(EventObject anEvent) {
    return true;
    public boolean shouldSelectCell(EventObject anEvent) {
    return true;
    public boolean stopCellEditing() {
    fireEditingStopped();
    return true;
    // Implementing the TreeCellEditor Interface
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
    this.editorComponent = (TestComponent)value;
    return editorComponent;
    //ComponentCellRenderer.java
    public class ComponentCellRenderer implements TableCellRenderer
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    TestComponent oComp = (TestComponent) value;
    if (isSelected) {
    oComp.setForeground(table.getSelectionForeground());
    oComp.setBackground(table.getSelectionBackground());
    } else {
    oComp.setForeground(table.getForeground());
    oComp.setBackground(table.getBackground());     
    return oComp;
    //TestTable.java
    public class TestTable
    public static void main(String []args){
    String columns[] = {"Text", "Value"};          
    Class types[] = {String.class, TestComponent.class};
    boolean editable[] = {false, true};
    AsrTable table = new AsrTable(new Dimension(200, 150), columns, types, editable);
    table.addRow(new Object[]{"Field1", new TestComponent(0)});
    table.addRow(new Object[]{"Field2", new TestComponent(1)});
    table.addRow(new Object[]{"Field3", new TestComponent(2)});
    table.setDefaultEditor(TestComponent.class, new ComponentCellEditor());
    table.setDefaultRenderer(TestComponent.class, new ComponentCellRenderer());
    table.setShowGrid(false);
    table.setRowHeight(20);
    table.setRowSelectionAllowed(false);
    JFrame frame = new JFrame();
    frame.addWindowListener( new WindowAdapter() {
         public void windowClosing(WindowEvent e)
         Window win = e.getWindow();
         win.setVisible(false);
         win.dispose();
         System.exit(0);
    JScrollPane pane = new JScrollPane(table);
    frame.getContentPane().add(pane);
    frame.pack();
    frame.setVisible(true);
    }

    My last post doesn't have Code Formatting.
    // TestComponent.java
    public class TestComponent extends JPanel{
         private int componentHeight=16;
         public TestComponent(int i){
              this.setPreferredSize(new Dimension(90, this.componentHeight));
              setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
              switch (i){
                   case 0: createTextField(); break;
                   case 1: createCheckBox(); break;
              case 2: createCombo(); break;
         private void createTextField(){
              String text = null;
              int textFieldMaxLength = 5;
              JTextField oText = new JTextField(textFieldMaxLength);
              // add it to this Panel:
              this.add(oText);
              // set the data:
              text = "test";
              oText.setText(text);
              // set size for this TextField:
              Dimension fieldSize = new Dimension(
                        textFieldMaxLength * 13, this.componentHeight);
              oText.setPreferredSize(fieldSize);
              oText.setMinimumSize(fieldSize);
              oText.setMaximumSize(fieldSize);
         private void createCheckBox(){
              JCheckBox chkbox = new JCheckBox();
              this.add(chkbox);
         private void createCombo(){
              JComboBox combo = new JComboBox(new String[]{"apple", "orange", "plum", "grapefruit"});
              Dimension fieldSize = new Dimension( 5 * 13, this.componentHeight);
              combo.setPreferredSize(fieldSize);
              combo.setMinimumSize(fieldSize);
              combo.setMaximumSize(fieldSize);
              this.add(combo);
    // ComponentCellEditor.java
    public class ComponentCellEditor extends AbstractCellEditor 
         implements TableCellEditor, Serializable
         protected JComponent editorComponent = null;     
         public Component getComponent() {
              return editorComponent;
         public Object getCellEditorValue() {
              return editorComponent;     
         public boolean isCellEditable(EventObject anEvent) {
              return true;
         public boolean shouldSelectCell(EventObject anEvent) {
              return true;
         public boolean stopCellEditing() {
              fireEditingStopped();
              return true;
    //  Implementing the TreeCellEditor Interface
        public Component getTableCellEditorComponent(JTable table, Object value,
              boolean isSelected, int row, int column) {
              this.editorComponent = (TestComponent)value;
              return editorComponent;
    // ComponentCellRenderer.java
    public class ComponentCellRenderer implements TableCellRenderer
         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row,
                   int column) {
              TestComponent oComp = (TestComponent) value;
              if (isSelected) {
                   oComp.setForeground(table.getSelectionForeground());
                   oComp.setBackground(table.getSelectionBackground());
              } else {
                   oComp.setForeground(table.getForeground());
                   oComp.setBackground(table.getBackground());
              return oComp;
    // TestTable.java
    public class TestTable
         public static void main(String []args){
              String columns[] = {"Text", "Value"};          
              Class types[] = {String.class, TestComponent.class};
              boolean editable[] = {false, true};
              AsrTable table = new AsrTable(new Dimension(200, 150), columns, types, editable);
              table.addRow(new Object[]{"Field1", new TestComponent(0)});
              table.addRow(new Object[]{"Field2", new TestComponent(1)});
              table.addRow(new Object[]{"Field3", new TestComponent(2)});
              table.setDefaultEditor(TestComponent.class, new ComponentCellEditor());
              table.setDefaultRenderer(TestComponent.class, new ComponentCellRenderer());
              table.setShowGrid(false);
              table.setRowHeight(20);
              table.setRowSelectionAllowed(false);
              JFrame frame = new JFrame();
              frame.addWindowListener( new WindowAdapter() {
                   public void windowClosing(WindowEvent e)
                        Window win = e.getWindow();
                        win.setVisible(false);
                        win.dispose();
                        System.exit(0);
              JScrollPane pane = new JScrollPane(table);
              frame.getContentPane().add(pane);
              frame.pack();
              frame.setVisible(true);
    }

  • Editable JComboBox in JTable focus issue

    Please look at the sample code below.
    I am using a JComboBox as the editor for a column in the table. When a cell in that column is edited and the user presses enter, the cell is no longer in edit mode. However, the focus is now set on the next component in the scrollpane (which is a textfield).
    If I don't add the textfield and the the table is the only component in the scroll pane, then focus correctly remains on the selected cell.
    When the user exits edit mode, I'd like the table to have focus and for the cell to remain selected. How can I achieve this?
    thanks,
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.*;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import javax.swing.plaf.basic.*;
    import java.awt.Component;
    import javax.swing.JComboBox;
    import java.util.EventObject;
    import java.awt.event.*;
    import javax.swing.event.*;
    public class TableComboBoxTest extends JFrame {
         protected JTable table;
         public TableComboBoxTest() {
              Container pane = getContentPane();
              pane.setLayout(new BorderLayout());
              MyTableModel model = new MyTableModel();
              table = new JTable(model);
              table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
              table.setSurrendersFocusOnKeystroke(true);
              TableColumnModel tcm = table.getColumnModel();
              TableColumn tc = tcm.getColumn(MyTableModel.GENDER);
              tc.setCellEditor(new MyGenderEditor(new JComboBox()));
              tc.setCellRenderer(new MyGenderRenderer());
              JScrollPane jsp = new JScrollPane(table);
              pane.add(jsp, BorderLayout.CENTER);          
              pane.add(new JTextField("focus goes here"), BorderLayout.SOUTH);
         public static void main(String[] args) {
              TableComboBoxTest frame = new TableComboBoxTest();
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setSize(500, 300);
              frame.setLocationRelativeTo(null);
              frame.setVisible(true);
         public class MyTableModel extends AbstractTableModel {
              public final static int FIRST_NAME = 0;
              public final static int LAST_NAME = 1;
              public final static int DATE_OF_BIRTH = 2;
              public final static int ACCOUNT_BALANCE = 3;
              public final static int GENDER = 4;
              public final static boolean GENDER_MALE = true;
              public final static boolean GENDER_FEMALE = false;
              public final String[] columnNames = {
                   "First Name", "Last Name", "Date of Birth", "Account Balance", "Gender"
              public Object[][] values = {
                        "Clay", "Ashworth",
                        new GregorianCalendar(1962, Calendar.FEBRUARY, 20).getTime(),
                        new Float(12345.67), "three"
                        "Jacob", "Ashworth",
                        new GregorianCalendar(1987, Calendar.JANUARY, 6).getTime(),
                        new Float(23456.78), "three1"
                        "Jordan", "Ashworth",
                        new GregorianCalendar(1989, Calendar.AUGUST, 31).getTime(),
                        new Float(34567.89), "three2"
                        "Evelyn", "Kirk",
                        new GregorianCalendar(1945, Calendar.JANUARY, 16).getTime(),
                        new Float(-456.70), "One"
                        "Belle", "Spyres",
                        new GregorianCalendar(1907, Calendar.AUGUST, 2).getTime(),
                        new Float(567.00), "two"
              public int getRowCount() {
                   return values.length;
              public int getColumnCount() {
                   return values[0].length;
              public Object getValueAt(int row, int column) {
                   return values[row][column];
              public void setValueAt(Object aValue, int r, int c) {
                   values[r][c] = aValue;
              public String getColumnName(int column) {
                   return columnNames[column];
              public boolean isCellEditable(int r, int c) {
                   return c == GENDER;
         public class MyComboUI extends BasicComboBoxUI {
              public JList getList()
                   return listBox;
         public class MyGenderRenderer extends DefaultTableCellRenderer{
              public MyGenderRenderer() {
                   super();
              public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
                        boolean hasFocus, int row, int column) {
                   JComboBox box = new JComboBox();
                   box.addItem(value);
                   return box;
         public class MyGenderEditor extends DefaultCellEditor  { // implements CaretListener {
              protected EventListenerList listenerList = new EventListenerList();
              protected ChangeEvent changeEvent = new ChangeEvent(this);
              private JTextField comboBoxEditorTField;
              Object newValue;
              JComboBox _cbox;
              public MyGenderEditor(JComboBox cbox) {
                   super(cbox);
                   _cbox = cbox;
                   comboBoxEditorTField = (JTextField)_cbox.getEditor().getEditorComponent();
                   _cbox.addItem("three");
                   _cbox.addItem("three1");
                   _cbox.addItem("three2");
                   _cbox.addItem("One");
                   _cbox.addItem("two");
                   _cbox.setEditable(true);
                   _cbox.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent event) {
                             System.out.println("\nactionPerformed ");
                             fireEditingStopped();
              public void addCellEditorListener(CellEditorListener listener) {
                   listenerList.add(CellEditorListener.class, listener);
              public void removeCellEditorListener(CellEditorListener listener) {
                   listenerList.remove(CellEditorListener.class, listener);
              protected void fireEditingStopped() {
                   System.out.println("fireEditingStopped called ");
                   CellEditorListener listener;
                   Object[] listeners = listenerList.getListenerList();
                   for (int i = 0; i < listeners.length; i++) {
                        if (listeners[i] instanceof CellEditorListener) {
                             System.out.println("calling editingStopped on listener....................");                    
                             listener = (CellEditorListener) listeners;
                             listener.editingStopped(changeEvent);
              protected void fireEditingCanceled() {
                   System.out.println("fireEditingCanceled called ");
                   CellEditorListener listener;
                   Object[] listeners = listenerList.getListenerList();
                   for (int i = 0; i < listeners.length; i++) {
                        if (listeners[i] instanceof CellEditorListener) {
                             listener = (CellEditorListener) listeners[i];
                             listener.editingCanceled(changeEvent);
              public void cancelCellEditing() {
                   System.out.println("cancelCellEditing called ");
                   fireEditingCanceled();
              public void addNewItemToComboBox() {
                   System.out.println("\naddNewItemToComboBox called ");
                   // tc - start
                   String text = comboBoxEditorTField.getText();
                   System.out.println("text = "+text);                    
                   int index = -1;
                   for (int i = 0; i < _cbox.getItemCount(); i++)
                        String item = ((String)_cbox.getItemAt(i));
                        System.out.println("item in cbox = "+item);
                        if (item.equals(text))
                             System.out.println("selecting item now...");                              
                             index = i;
                             _cbox.setSelectedIndex(index);
                             break;
                   if (index == -1)
                        _cbox.addItem(text);
                        int count = _cbox.getItemCount();
                        _cbox.setSelectedIndex(count -1);
              public boolean stopCellEditing() {
                   System.out.println("stopCellEditing called ");
                   fireEditingStopped();
                   _cbox.transferFocus();
                   return true;
              public boolean isCellEditable(EventObject event) {
                   return true;     
              public boolean shouldSelectCell(EventObject event) {
                   return true;
              public Object getCellEditorValue() {
                   System.out.println("- getCellEditorValue called returning val: "+_cbox.getSelectedItem());
                   return _cbox.getSelectedItem();
              public Component getTableCellEditorComponent(JTable table, Object value,
                        boolean isSelected, int row, int column) {
                   System.out.println("\ngetTableCellEditorComponent "+value);
                   String text = (String)value;               
                   for (int i = 0; i < _cbox.getItemCount(); i++)
                        String item = ((String)_cbox.getItemAt(i));
                        System.out.println("item in box "+item);
                        if (item.equals(text))
                             System.out.println("selecting item now...");     
                             _cbox.setSelectedIndex(i);
                             break;
                   return _cbox;

    I was using java 1.5.0_06 in my application and I had this problem
    When I upgraded to java 1.6.0_01, I no longer had this issue.
    This seems to be a bug in 1.5 version of Java that has been fixed in 1.6
    thanks,

  • Jtextfield inside jtable..please i need help

    Hello, im trying to put textfield in a cell of Jtable but appears the following text inside of JTextField that i've inserted...
    javax.swing.JTextField[,0,0,0x0,invalid,disabled,layout=javax.swing.plaf.basic.Basic
    TextUI$UpdateHandler,alignmentX=0.0,alignmentY=0.0,border=javax.swing.plaf.Border
    UIResource$CompoundBorderUIResource@196c1b0,flags=296,maximumSize=,minimumSize
    =,preferredSize=,caretColor=sun.swing.PrintColorUIResource[r=51,g=51,b=51],disabled
    TextColor=javax.swing.plaf.ColorUIResource[r=184,g=207,b=229],editable=true,margin=
    javax.swing.plaf.InsetsUIResource[top=0,left=0,bottom=0,right=0],selectedTextColor=
    sun.swing.PrintColorUIResource[r=51,g=51,b=51],selectionColor=javax.swing.plaf.Color
    UIResource[r=184,g=207,b=229],columns=0,columnWidth=0,command=,horizontal
    Alignment=LEADING]
    Thus i've implemented a class FBaseTableCellEditor extends DefaultCellEditor that allow me to have JTextfield like cell of JTable.
    this is the source code :
    public class FBaseTableCellEditor extends DefaultCellEditor {
    public FBaseTableCellEditor() {
    super(new javax.swing.JTextField());
    this.editorComponent = new javax.swing.JTextField();
    //this.setClickCountToStart(1);
    ths is the source code to insert a new row in the JTable:
    private void AddRowsinTable(){
    int row = JTable.getRowCount() - 1;
    JTextField[] newrow = CreateRow();
    this.DefaultTableModel.addRow(newrow);
    private JTextField[] CreateRow()
    JTextField[] newrow = {this.JTextField0, this.JTextField1, this.JTextField2, this.JTextField3, this.JTextField4, this.JTextField5, this.JTextField6};
    return newrow;
    PLEASE I NEED HELP...
    Message was edited by:
    negrera

    tripple posting: http://forum.java.sun.com/thread.jspa?threadID=5120228

  • Inputverifier+Jtextfield inside JTable

    I've got an application which a JTable.
    Inside the JTable I've got a JTextfield for editing the fisrt column
    jTable1.getColumn("First" ).setCellEditor( new DefaultCellEditor( mytextfield ) );
    The JTextField has a InputVerifier
    This InputVerifier is called when I try to click outside the JTextField
    But The JTextField lost the focus always.
    What should I do to keep the focus on the JtextField ?
    The problem is only when the JTextfield is inside the JTable, if the JTextField is outside then the focus works fine.
    Thanks.
    wmiro.

    Hi,
    Create your own editor which implements TableCellEditor and let the stopCellEditing() method
    have a logic like this:
    public boolean stopCellEditing()
          if (selectedEditor == stringEditor)
             boolean valid = textField.getInputVerifier().verify(textField);
             if (!valid) return false;
          return selectedEditor.stopCellEditing();
       }

  • How to edit databases from JTable?

    Hello everyone, I would like to ask your help on how we can edit JTable cells that would be reflected into the database, or how do we change the database via a JTable.
    I have the installer of an application which I made with Java SE called FuelStation.exe
    My class files are ready for sharing along with its source files.
    I have placed it in this location in my website:
    http://www.apachevista.com/alphaprojects/runfiles/
    It is complete with full details about databases, proposed mysql embed, and so on. Please see the file and notify me at [email protected]
    Here is my sample code:
    // DisplayQueryResults.java
    // Display the contents of the Authors table in the
    // Books database.
    import java.awt.BorderLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.sql.SQLException;
    import javax.swing.JFrame;
    import javax.swing.JTextArea;
    import javax.swing.JScrollPane;
    import javax.swing.ScrollPaneConstants;
    import javax.swing.JTable;
    import javax.swing.JOptionPane;
    import javax.swing.JButton;
    import javax.swing.Box;
    import javax.swing.JInternalFrame;
    import java.util.*; // for the Bundle
    import javax.swing.event.InternalFrameEvent;
    import javax.swing.event.InternalFrameListener;
    import javax.swing.event.InternalFrameAdapter;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import javax.swing.ListSelectionModel;
    import javax.swing.event.ListSelectionEvent;
    import javax.swing.event.ListSelectionListener;
    import javax.swing.event.*; // step 1
    import javax.swing.table.TableModel; // step 1
    public class DisplayQueryResults extends JInternalFrame implements TableModelListener { // step 2
    // JDBC driver, database URL, username and password
    ResourceBundle bundle = ResourceBundle.getBundle("Accounting");
    final String JDBC_DRIVER = bundle.getString("Driver");
    final String DATABASE_URL = bundle.getString("URL");
    final String USERNAME = bundle.getString("User");
    final String PASSWORD = bundle.getString("Password");
    // default query retrieves all data from authors table
    //static final String DEFAULT_QUERY = "SELECT authors.lastName, authors.firstName, titles.title, titles.editionNumber FROM titles INNER JOIN (authorISBN INNER JOIN authors ON authorISBN.authorID=authors.authorID) ON titles.isbn=authorISBN.isbn";
    final String DEFAULT_QUERY = bundle.getString("Query");
    private ResultSetTableModel tableModel;
    private JTextArea queryArea;
    static final int xOffset = 0, yOffset = 200;
    private boolean ALLOW_COLUMN_SELECTION = false;
    private boolean ALLOW_ROW_SELECTION = true;
    // create ResultSetTableModel and GUI
    public DisplayQueryResults() {  
    super("Sales of the Day",
    true, //resizable
    true, //closable
    true, //maximizable
    false);//iconifiable
    //...Create the GUI and put it in the window...
    //Set the window's location.
    setLocation(xOffset, yOffset);
    // create ResultSetTableModel and display database table
    try {
    // create TableModel for results of query SELECT * FROM authors
    tableModel = new ResultSetTableModel(JDBC_DRIVER, DATABASE_URL,
    USERNAME, PASSWORD, DEFAULT_QUERY);
    // set up JTextArea in which user types queries
    queryArea = new JTextArea(DEFAULT_QUERY, 1, 100);
    queryArea.setWrapStyleWord(true);
    queryArea.setLineWrap(true);
    JScrollPane scrollPane = new JScrollPane(queryArea,
    ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
    ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
    // set up JButton for submitting queries
    JButton submitButton = new JButton("Submit Query");
    // create Box to manage placement of queryArea and
    // submitButton in GUI
    Box box = Box.createHorizontalBox();
    box.add(scrollPane);
    box.add(submitButton);
    // create JTable delegate for tableModel
    JTable resultTable = new JTable(tableModel);
    resultTable.setFillsViewportHeight(true); // Makes the empty space heights white
    resultTable.setRowSelectionAllowed(true);
    resultTable.getModel().addTableModelListener(this); // step 3
    // place GUI components on content pane
    add(box, BorderLayout.NORTH);
    add(new JScrollPane(resultTable), BorderLayout.CENTER);
    // create event listener for submitButton
    submitButton.addActionListener(
    new ActionListener()
    // pass query to table model
    public void actionPerformed(ActionEvent event)
    // perform a new query
    try
    tableModel.setQuery(queryArea.getText());
    } // end try
    catch ( SQLException sqlException)
    JOptionPane.showMessageDialog(null,
    sqlException.getMessage(), "Database error",
    JOptionPane.ERROR_MESSAGE);
    // try to recover from invalid user query
    // by executing default query
    try {
    tableModel.setQuery(DEFAULT_QUERY);
    queryArea.setText(DEFAULT_QUERY);
    } // end try
    catch (SQLException sqlException2) {
    JOptionPane.showMessageDialog(null,
    sqlException2.getMessage(), "Database error",
    JOptionPane.ERROR_MESSAGE);
    // ensure database connection is closed
    tableModel.disconnectFromDatabase();
    System.exit(1); // terminate application
    } // end inner catch
    } // end outer catch
    } // end actionPerformed
    } // end ActionListener inner class
    ); // end call to addActionListener
    //...Then set the window size or call pack...
         setSize(750,300);
    setVisible(true); // display window
    } // end try
    catch (ClassNotFoundException classNotFound) {
    JOptionPane.showMessageDialog(null,
    "MySQL driver not found", "Driver not found",
    JOptionPane.ERROR_MESSAGE);
    System.exit(1); // terminate application
    } // end catch
    catch (SQLException sqlException) {
    JOptionPane.showMessageDialog(null, sqlException.getMessage(),
    "Database error", JOptionPane.ERROR_MESSAGE);
    // ensure database connection is closed
    tableModel.disconnectFromDatabase();
    System.exit(1); // terminate application
    } // end catch
    // dispose of window when user quits application (this overrides
    // the default of HIDE_ON_CLOSE)
    setDefaultCloseOperation(DISPOSE_ON_CLOSE);
    // ensure database connection is closed when user quits application
    addInternalFrameListener(
    new InternalFrameAdapter() {
    // disconnect from database and exit when window has closed
    public void windowClosed(WindowEvent event) {
    tableModel.disconnectFromDatabase();
    System.exit(0);
    } // end method windowClosed
    } // end WindowAdapter inner class
    ); // end call to addWindowListener
    } // end DisplayQueryResults constructor
    public void tableChanged(TableModelEvent e) { // step 4
    int row = e.getFirstRow();
    int column = e.getColumn();
    TableModel model = (TableModel)e.getSource();
    String columnName = model.getColumnName(column);
    Object tableModel = model.getValueAt(row, column);
    // Do something with the data...
    System.out.println(tableModel);
    System.out.println("data");
    // execute application
    public static void main(String args[]) {
    new DisplayQueryResults();
    } // end main
    } // end class DisplayQueryResults
    My question is in lines 177-187:
    public void tableChanged(TableModelEvent e) { // step 4
    int row = e.getFirstRow();
    int column = e.getColumn();
    TableModel model = (TableModel)e.getSource();
    String columnName = model.getColumnName(column);
    Object tableModel = model.getValueAt(row, column);
    // Do something with the data...
    System.out.println(tableModel);
    System.out.println("data");
    Why is my listener not working or why is it not implemented when I click the cells in the JTable and why is it not reflected into the JTable or into the console?
    If this is Flash, Things can be done easily, but this is Java, and I dont know much about this language. I admit that I am new to this -intirely new.
    PS:
    When you have solved the problem, please notify me with the code that's changed
    and please share it to others if you like so.
    Best Wishes: Oliver Bob Lagumen
    Email: [email protected]
    website: www.apachevista.com
    Oliver Bob Lagumen
    Edited by: Oliverbob on Jan 24, 2008 9:03 PM

    Why is my listener not working or why is it not implemented when I click the cells in the JTable and why is it not reflected into the JTable or into the console?What does happen when you click on the cells?
    Does the ResultSetTableModel report the cells as editable? If not you will never get to edit their contents, and so the table's model won't change, and so the table model listener will never get invoked.
    When you post code here use the code tags. Basically you put {code} at the start of your code and again at the end. That way the code will be readable.
    Try to post minimal examples with which others can reproduce your problem. In this case "minimal" would involve removing or drastically simplifying a lot of the GUI stuff which is just noise. But "reproduce" would involve including the ResultSetTableModel.
    When you have solved the problem, please notify me with the code that's changedAvoid this.
    What you say here is quite possibly not what you mean. But, in any event, while there might be plenty of interest in helping with specific problems there will likely be none in writing your code. Your problem remains yours. But your solution and your code - prompted by whatever help you might recieve - will also be yours.

Maybe you are looking for

  • A/r invoice Row

    when i  punch A/R Invoice it shows me an error:- you can not add or update this document,row n row number is missing. please help me.

  • Cost center and proit center bi reports

    hi all ;    we want to prepare bi reports for cost center and profit centers same as r/3 report standard and r/3 features in bi so help me out in this how to follow iam new to bi l regards ram

  • TOLERANCE KEY ERROR DURING MIGO

    Hi ., When i am doing a GR against a PO using Movement type 101 , i am getting the following error: " MAINTAIN TOLERANCE LIMITS  FOR TOLERANCE KEY VP FOR COCODE 0001" Now i have tried through the following navigation" MM-Purchasing ->Purchase order->

  • Getting my S5s tomorrow and need to prepare

    I just ordered the BOGO S5 phones adding two more lines to my account. I already have a family plan and I have my S4 and the other two lines are basic lines.   When the S5s arrive tomorrow, I want to take one of the S5s and activate it on my line, ta

  • Azure Antimalware (Endpoint Protection) says "your system administrator has restricted access to this app"

    I see many posts about using SCCM to configure policies, etc., etc. However, I can't find any information about my specific issue: I have installed the Antimalware extension on several Azure VMs. Only one VM allows access to "System Center Endpoint P