# 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 >
