Intercommunication among cells of JTable

Hi,

I am using JTable that is obtained from DefaultTableModel. In each cell I have put new objects of JComboBox . While adding a row to the table I have used DefaultTableCellRenderer to each TableColumn object. What should I do so that when I select an entry in one combobox, I should be able to change the contents in some other combobox in the table immediately?

[377 byte] By [mohangupta_chegua] at [2007-11-27 10:22:46]
# 1

Run this example, click on the add button to add a row, then change the item of the first combo box.

import java.awt.BorderLayout;

import java.awt.Component;

import java.awt.Dimension;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTable;

import javax.swing.event.TableModelEvent;

import javax.swing.event.TableModelListener;

import javax.swing.table.DefaultTableColumnModel;

import javax.swing.table.DefaultTableModel;

import javax.swing.table.TableColumn;

import javax.swing.JButton;

import javax.swing.*;

import javax.swing.table.*;

import java.util.Vector;

import java.awt.event.*;

public class TableDemo4 extends JFrame implements TableModelListener, ActionListener {

JPanel panel = null;

JTable table = null;

JButton button = null;

JButton delete = null;

JButton insert = null;

MyModel model = null;

String values[];

String values1[];

String values2[];

Object data[][];

private JButton values4;

public TableDemo4(String title){

super(title);

String columnNames[] = {"Column1", "Column2", "Column3"};

values = new String[]{"P", "O", "H"};

values1 = new String[]{" ","One", "Two", "Three", "Four"};

values2 = new String[]{"Y", "N", "Firefox", "Swings"};

values4 = new JButton("...");

data = new Object[][] {

{values, values1, values2, values4}

};

//model = new MyModel(data, columnNames);

model = new MyModel();

model.addTableModelListener(this);

table = new JTable();

button = new JButton("Add");

delete = new JButton("Delete");

insert = new JButton("Insert");

panel = new JPanel();

panel.setLayout(new BorderLayout());

model.addColumn("Column");

model.addColumn("Operator");

model.addColumn("Value");

//model.addColumn("Logical");

//model.addRow(data);

table.setModel(model);

TableColumn column = table.getColumnModel().getColumn(0);

column.setPreferredWidth(1);

column.setCellEditor(new MyComboBoxEditor(values));

column.setCellRenderer(new MyComboBoxRenderer(values));

//TableColumn column1 = table.getColumnModel().getColumn(1);

//column1.setCellEditor(new DefaultCellEditor());

//column1.setCellRenderer(new DefaultCellRenderer());

TableColumn column2 = table.getColumnModel().getColumn(2);

column2.setCellEditor(new MyComboBoxEditor(values2));

column2.setCellRenderer(new MyComboBoxRenderer(values2));

// Create the table, place it into scroll pane and place

// the pane into this frame.

table.setPreferredScrollableViewportSize(table.getPreferredSize());

JScrollPane scroll = new JScrollPane(table);

// The horizontal scroll bar is never needed.

//scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

//scroll.getViewport().add(table);

button.addActionListener(this);

delete.addActionListener(this);

insert.addActionListener(this);

panel.add(delete, BorderLayout.NORTH);

panel.add(insert, BorderLayout.EAST);

panel.add(scroll, BorderLayout.CENTER);

panel.add(button, BorderLayout.SOUTH);

getContentPane().add(panel, BorderLayout.CENTER);

String strPlaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

try {

//set the look and feel as of windows

UIManager.setLookAndFeel(strPlaf);

//setting new grid border for table header

UIManager.put("TableHeader.cellBorder",BorderFactory.createEmptyBorder(1, 1, 1, 1));

SwingUtilities.updateComponentTreeUI(this);

} catch(Exception e) {

e.printStackTrace();

}

}

public void actionPerformed(ActionEvent ae) {

if(ae.getSource() == button) {

data = new Object[][] {

{values, values1, values2}

};

model.addRow(data);

model.fireTableDataChanged();

} else if(ae.getSource() == delete ) {

int index = table.getSelectedRow();

model.removeRow(index);

} else {

int index = table.getSelectedRow();

model.insertRow(index, new Object[]{"Value", "Insert"});

}

}

class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {

public MyComboBoxRenderer(String[] items) {

super(items);

}

public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {

if (isSelected) {

setForeground(table.getSelectionForeground());

super.setBackground(table.getSelectionBackground());

} else {

setForeground(table.getForeground());

setBackground(table.getBackground());

}

// Select the current value

setSelectedItem(value);

return this;

}

}

public class MyComboBoxEditor extends DefaultCellEditor {

public MyComboBoxEditor(String[] items) {

super(new JComboBox(items));

}

private void addFocusListener(Component C) {

super.getComponent().addFocusListener(new java.awt.event.FocusAdapter() {

public void focusLost(java.awt.event.FocusEvent fe) { lostFocus(); }

});

}

public void lostFocus() { stopCellEditing(); }

}

public class FocusCellEditor extends DefaultCellEditor {

Component c;

public FocusCellEditor(JCheckBox jcb) {

super(jcb);

addFocusListener(jcb);

}

public FocusCellEditor(JComboBox jcb) {

super(jcb);

addFocusListener(jcb);

}

public FocusCellEditor(JTextField jtf) {

super(jtf);

addFocusListener(jtf);

}

private void addFocusListener(Component C) {

super.getComponent().addFocusListener(new java.awt.event.FocusAdapter() {

public void focusLost(java.awt.event.FocusEvent fe) { lostFocus(); }

});

}

public void lostFocus() { stopCellEditing(); }

}

public static void main(String[] args) {

TableDemo4 frame = new TableDemo4("Table double click on the cell to edit.");

frame.setSize(new Dimension(640, 400));

frame.validate();

frame.setVisible(true);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

public void tableChanged(TableModelEvent e) {

//System.out.println(e.getSource());

//System.out.println("Inside the Table Model Event Block");

if (e.getType() == TableModelEvent.UPDATE)

{

//System.out.println("Inside the Table Model Event UPDATE Block");

int row = e.getFirstRow();

int column = e.getColumn();

if (column == 0)

{

TableModel model = table.getModel();

if(model.getValueAt(row,0) == "P") {

//System.out.println("Trying to set the value");

model.setValueAt("Y", row, 1);

model.setValueAt("Y", row, 2);

} else if(model.getValueAt(row,0) != "P") {

//System.out.println("Something went wrong");

model.setValueAt("N", row, 1);

model.setValueAt("N", row, 2);

// The Cost is not editable

//table.editCellAt(row, column);

}

//int quantity = ((Integer)model.getValueAt(row, 1)).intValue();

//double price = ((Double)model.getValueAt(row, 2)).doubleValue();

//Double value = new Double(quantity * price);

//model.setValueAt(value, row, 3);

}

}

}

public class MyModel extends DefaultTableModel {

public boolean isCellEditable(int row, int column) {

if(column == 0 || table.getValueAt(row, 0) == "P") {

return (column == 0 || column == 2) ? true : false;

} else

return (column == 0 ) ? true : false;

}

}

}

max25a at 2007-7-28 17:17:59 > top of Java-index,Desktop,Core GUI APIs...
# 2

You can add celleditorlistener to you cbo editor. Note - the listeners must be added before setting the cell editors on the table.

import javax.swing.DefaultCellEditor;

import javax.swing.JComboBox;

import javax.swing.event.CellEditorListener;

import javax.swing.event.ChangeEvent;

public class ComboListeners {

public static void main (String args[]){

Object data[] = {"data1", "data2", "data3" } ;

JComboBox comboBox = new JComboBox(data);

DefaultCellEditor editor = new DefaultCellEditor(comboBox);

editor.addCellEditorListener(new CellEditorListener(){

public void editingCanceled(ChangeEvent e) {

// nothing to do....

}

public void editingStopped(ChangeEvent e) {

//update your other 'dependent' data from here...

}

});

}

}

imran_ea at 2007-7-28 17:17:59 > top of Java-index,Desktop,Core GUI APIs...