netwiz
asked on
Having different row colors in a JTable
Hi all,
I have an empty table attached to a JScrollPane. How to update(add/delete rows) the table dynamically (say by an external event)? Also the rows will have different colors depending on a field of the table. How to implement it. I am new in Java so I need the code in a bit details. Thank you very much....
netwiz
I have an empty table attached to a JScrollPane. How to update(add/delete rows) the table dynamically (say by an external event)? Also the rows will have different colors depending on a field of the table. How to implement it. I am new in Java so I need the code in a bit details. Thank you very much....
netwiz
Question 2:
package tests.swing.table;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapte r;
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.DefaultCellEdi tor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionM odel;
import javax.swing.event.CellEdit orListener ;
import javax.swing.event.ChangeEv ent;
import javax.swing.table.Abstract TableModel ;
import javax.swing.table.DefaultT ableCellRe nderer;
import javax.swing.table.TableCol umn;
public class RolloverTableCells extends JFrame {
private SmartTable table;
private SmartTableModel model;
public RolloverTableCells() {
init();
}
private void init() {
getContentPane().setLayout (new BorderLayout());
setSize(400, 300);
setLocation(300, 100);
table = new SmartTable();
getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
setVisible(true);
}
class SmartTable extends JTable {
public SmartTable() {
model = new SmartTableModel();
setModel(model);
createColumns();
setForeground(Color.red);
setBackground(new Color(255, 239, 185));
setGridColor(Color.orange) ;
setSelectionMode(ListSelec tionModel. SINGLE_SEL ECTION);
setRowHeight(35);
setSelectedRow(0);
setSelectedCol(0);
}
protected void createColumns() {
for(int i = 0; i<model.getColumnCount(); i++) {
TableColumn column = getColumn(model.getColumnN ame(i));
column.setCellRenderer(new GenericRenderer());
column.setCellEditor(new GenericEditor());
}
}
public void setSelectedRow(int row) {
if(row == -1)
return;
else {
setRowSelectionInterval(ro w, row);
}
}
public void setSelectedCol(int col) {
if(col == -1)
return;
else {
setColumnSelectionInterval (col, col);
}
}
}
class SmartTableModel extends AbstractTableModel {
protected ColumnDescriptor cols[] = {
new ColumnDescriptor("Field1", 40, JLabel.LEFT),
new ColumnDescriptor("Field2", 50, JLabel.LEFT),
new ColumnDescriptor("Field3", 100, JLabel.LEFT),
};
protected Vector dObjects;
public SmartTableModel() {
dObjects = new Vector();
initModelData();
}
public void initModelData() {
Object[] row = new Object[3];
row[0] = "string"; row[1] = "string"; row[2] = "string";
dObjects.addElement(row);
row = new Object[3];
row[0] = "string"; row[1] = "string"; row[2] = new JButton("button");
dObjects.addElement(row);
row = new Object[3];
row[0] = "string"; row[1] = new JButton("button"); row[2] = "string";
dObjects.addElement(row);
row = new Object[3];
row[0] = "string"; row[1] = new JButton("button"); row[2] = new JCheckBox("checkbox");
dObjects.addElement(row);
row = new Object[3];
row[0] = new JButton("button");row[1] = new JCheckBox("checkbox");row[ 2] = "string";
dObjects.addElement(row);
row = new Object[3];
row[0] = new JButton("button");row[1] = new JCheckBox("checkbox");row[ 2] = new JButton("button");
dObjects.addElement(row);
row = new Object[3];
String[] items = {"Item 1", "Item 2", "Item 3"};
row[0] = new JComboBox(items);row[1] = new JComboBox(items);row[2] = new JComboBox(items);
dObjects.addElement(row);
updateObjects();
}
protected void updateObjects() { fireTableDataChanged(); }
public int getColumnCount() { return(cols.length); }
public int getRowCount() { return(dObjects.size()); }
public String getColumnName(int c) { return(cols[c].name); }
public boolean isCellEditable(int row, int col) {
return((getObjectAt(row, col) instanceof String)?false:true);
}
public Object getObjectAt(int row, int col) {
return(((Object[]) dObjects.elementAt(row))[c ol]);
}
public Object getValueAt(int row, int col) {
if(getRowCount() <= 0)
return "";
if(row<0||row>=getRowCount ())
return "";
Object cellData = ((Object[]) dObjects.elementAt(row))[c ol];
return(cellData);
}
}
class ColumnDescriptor {
public String name;
public int width;
public int alignment;
public ColumnDescriptor(String n, int w, int a) {
name = n;
width = w;
alignment = a;
}
}
class GenericRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererCompon ent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int col) {
Object o = model.getObjectAt(row, col);
if(o instanceof JButton || o instanceof JCheckBox || o instanceof JComboBox) {
if(o instanceof JCheckBox)
((Component) o).setBackground(table.get Background ());
return((Component) o);
}
Component c = super.getTableCellRenderer Component( table, value, isSelected, hasFocus, row, col);
return(c);
}
}
class GenericEditor extends DefaultCellEditor {
JTable tbl;
private int lastRow = 0;
private int lastCol = 0;
private Component editor;
public GenericEditor() {
super(new JCheckBox());
}
public Component getTableCellEditorComponen t(JTable t, Object v, boolean sel, int r, int c) {
tbl = t;
lastRow = r;
lastCol = c;
Object o = model.getObjectAt(r, c);
if(o instanceof JButton || o instanceof JCheckBox || o instanceof JComboBox)
editor = (Component) o;
else
editor = new JTextField(v.toString());
editor.addMouseListener(ne w MouseAdapter() {
public void mouseEntered(MouseEvent me) {
editor.setBackground(Color .red);
}
public void mouseExited(MouseEvent me) {
editor.setBackground(Color .white);
}
});
return(editor);
}
public Object getCellEditorValue() {
return(model.getObjectAt(l astRow, lastCol));
}
public boolean isCellEditable(java.util.E ventObject ev) { return(true); }
public boolean shouldSelectCell(java.util .EventObje ct ev) { return(false); }
public boolean stopCellEditing() {
tbl.editingStopped(new ChangeEvent(this));
return(true);
}
public void cancelCellEditing() {}
public void addCellEditorListener(Cell EditorList ener cel) {}
public void removeCellEditorListener(C ellEditorL istener cel) {}
}
public static void main(String[] args) {
RolloverTableCells t = new RolloverTableCells();
}
}
package tests.swing.table;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapte
import java.awt.event.MouseEvent;
import java.util.Vector;
import javax.swing.DefaultCellEdi
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionM
import javax.swing.event.CellEdit
import javax.swing.event.ChangeEv
import javax.swing.table.Abstract
import javax.swing.table.DefaultT
import javax.swing.table.TableCol
public class RolloverTableCells extends JFrame {
private SmartTable table;
private SmartTableModel model;
public RolloverTableCells() {
init();
}
private void init() {
getContentPane().setLayout
setSize(400, 300);
setLocation(300, 100);
table = new SmartTable();
getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
setVisible(true);
}
class SmartTable extends JTable {
public SmartTable() {
model = new SmartTableModel();
setModel(model);
createColumns();
setForeground(Color.red);
setBackground(new Color(255, 239, 185));
setGridColor(Color.orange)
setSelectionMode(ListSelec
setRowHeight(35);
setSelectedRow(0);
setSelectedCol(0);
}
protected void createColumns() {
for(int i = 0; i<model.getColumnCount(); i++) {
TableColumn column = getColumn(model.getColumnN
column.setCellRenderer(new
column.setCellEditor(new GenericEditor());
}
}
public void setSelectedRow(int row) {
if(row == -1)
return;
else {
setRowSelectionInterval(ro
}
}
public void setSelectedCol(int col) {
if(col == -1)
return;
else {
setColumnSelectionInterval
}
}
}
class SmartTableModel extends AbstractTableModel {
protected ColumnDescriptor cols[] = {
new ColumnDescriptor("Field1",
new ColumnDescriptor("Field2",
new ColumnDescriptor("Field3",
};
protected Vector dObjects;
public SmartTableModel() {
dObjects = new Vector();
initModelData();
}
public void initModelData() {
Object[] row = new Object[3];
row[0] = "string"; row[1] = "string"; row[2] = "string";
dObjects.addElement(row);
row = new Object[3];
row[0] = "string"; row[1] = "string"; row[2] = new JButton("button");
dObjects.addElement(row);
row = new Object[3];
row[0] = "string"; row[1] = new JButton("button"); row[2] = "string";
dObjects.addElement(row);
row = new Object[3];
row[0] = "string"; row[1] = new JButton("button"); row[2] = new JCheckBox("checkbox");
dObjects.addElement(row);
row = new Object[3];
row[0] = new JButton("button");row[1] = new JCheckBox("checkbox");row[
dObjects.addElement(row);
row = new Object[3];
row[0] = new JButton("button");row[1] = new JCheckBox("checkbox");row[
dObjects.addElement(row);
row = new Object[3];
String[] items = {"Item 1", "Item 2", "Item 3"};
row[0] = new JComboBox(items);row[1] = new JComboBox(items);row[2] = new JComboBox(items);
dObjects.addElement(row);
updateObjects();
}
protected void updateObjects() { fireTableDataChanged(); }
public int getColumnCount() { return(cols.length); }
public int getRowCount() { return(dObjects.size()); }
public String getColumnName(int c) { return(cols[c].name); }
public boolean isCellEditable(int row, int col) {
return((getObjectAt(row, col) instanceof String)?false:true);
}
public Object getObjectAt(int row, int col) {
return(((Object[]) dObjects.elementAt(row))[c
}
public Object getValueAt(int row, int col) {
if(getRowCount() <= 0)
return "";
if(row<0||row>=getRowCount
return "";
Object cellData = ((Object[]) dObjects.elementAt(row))[c
return(cellData);
}
}
class ColumnDescriptor {
public String name;
public int width;
public int alignment;
public ColumnDescriptor(String n, int w, int a) {
name = n;
width = w;
alignment = a;
}
}
class GenericRenderer extends DefaultTableCellRenderer {
public Component getTableCellRendererCompon
boolean isSelected, boolean hasFocus, int row, int col) {
Object o = model.getObjectAt(row, col);
if(o instanceof JButton || o instanceof JCheckBox || o instanceof JComboBox) {
if(o instanceof JCheckBox)
((Component) o).setBackground(table.get
return((Component) o);
}
Component c = super.getTableCellRenderer
return(c);
}
}
class GenericEditor extends DefaultCellEditor {
JTable tbl;
private int lastRow = 0;
private int lastCol = 0;
private Component editor;
public GenericEditor() {
super(new JCheckBox());
}
public Component getTableCellEditorComponen
tbl = t;
lastRow = r;
lastCol = c;
Object o = model.getObjectAt(r, c);
if(o instanceof JButton || o instanceof JCheckBox || o instanceof JComboBox)
editor = (Component) o;
else
editor = new JTextField(v.toString());
editor.addMouseListener(ne
public void mouseEntered(MouseEvent me) {
editor.setBackground(Color
}
public void mouseExited(MouseEvent me) {
editor.setBackground(Color
}
});
return(editor);
}
public Object getCellEditorValue() {
return(model.getObjectAt(l
}
public boolean isCellEditable(java.util.E
public boolean shouldSelectCell(java.util
public boolean stopCellEditing() {
tbl.editingStopped(new ChangeEvent(this));
return(true);
}
public void cancelCellEditing() {}
public void addCellEditorListener(Cell
public void removeCellEditorListener(C
}
public static void main(String[] args) {
RolloverTableCells t = new RolloverTableCells();
}
}
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Ovi can you also take a look here: https://www.experts-exchange.com/questions/20559662/For-Ovi.html I have a question for you and I would like to PAQ it :-)
ASKER
Thanks Ovi.It just serves my purpose. I am ready to give you the points. Just a bit of info please. Can you give me some resources' name from where I can get the ordinary codes. As for VC++ we have codeguru.com etc. ?
first should be the java tutorial at java.sun.com
ASKER
Thank you very much!!! That's just excellent!!!
Me too.
... and don't forget the sources of your installed jdk for deeper detail and the sources of the demos you allready have installed in the jdk installation directory :-)
... and don't forget the sources of your installed jdk for deeper detail and the sources of the demos you allready have installed in the jdk installation directory :-)
package tests.swing.table;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent
import java.awt.event.ActionListe
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionM
import javax.swing.table.Abstract
import javax.swing.table.DefaultT
import javax.swing.table.TableCol
public class SimpleTable extends JFrame {
private SmartTable table;
private Actions actions;
public SimpleTable() { init(); }
private void init() {
getContentPane().setLayout
setSize(600, 300);
setLocation(300, 100);
table = new SmartTable();
actions = new Actions();
getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
getContentPane().add(actio
setVisible(true);
}
class Actions extends JPanel {
JButton add = new JButton("Add");
JButton remove = new JButton("Remove");
JButton selected = new JButton("Dump selected");
JButton dump = new JButton("Dump content to console");
public Actions() {
setLayout(new FlowLayout());
setListeners();
add(add);
add(remove);
add(selected);
add(dump);
}
public DBObject createDBObject() {
DBObject dbo = new DBObject();
int curent = SimpleTable.this.table.get
dbo.f1 = "DBO " + curent + " field 1";dbo.f2 = "DBO " + curent + " field 2";
dbo.f3 = "DBO " + curent + " field 3";dbo.f4 = "DBO " + curent + " field 4";
dbo.f5 = "DBO " + curent + " field 5";dbo.f6 = "DBO " + curent + " field 6";
dbo.f7 = "DBO " + curent + " field 7";dbo.f8 = "DBO " + curent + " field 8";
return(dbo);
}
protected void setListeners() {
add.addActionListener(new ActionListener() {
public void actionPerformed(ActionEven
SimpleTable.this.table.add
}
});
remove.addActionListener(n
public void actionPerformed(ActionEven
try {
int selected = SimpleTable.this.table.get
SimpleTable.this.table.rem
SimpleTable.this.table.set
} catch(Exception e) {}
}
});
selected.addActionListener
public void actionPerformed(ActionEven
try {
int row = SimpleTable.this.table.get
int col = SimpleTable.this.table.get
System.out.println("Select
} catch(Exception e) {}
}
});
dump.addActionListener(new
public void actionPerformed(ActionEven
Vector objs = SimpleTable.this.table.get
for(int i = 0; i < objs.size(); i++) {
DBObject o = (DBObject)objs.elementAt(i
System.out.println("DBObje
", " + o.f4 + ", " + o.f5 + ", " + o.f6 + ", " + o.f7 + ", " + o.f8);
}
}
});
}
}
class SmartTable extends JTable {
SmartTableModel model;
public SmartTable() {
model = new SmartTableModel();
createColumns();
setModel(model);
setForeground(Color.red);
setBackground(new Color(255, 239, 185));
setGridColor(Color.orange)
setSelectionMode(ListSelec
}
protected void createColumns() {
for(int i = 0; i<model.getColumnCount(); i++) {
DefaultTableCellRenderer renderer = new DefaultTableCellRenderer()
renderer.setHorizontalAlig
TableColumn column = new TableColumn(i, model.cols[i].width, renderer, null);
addColumn(column);
}
}
public void addDBObject(DBObject object) { model.addDBObject(object);
public void addDBObjects(Vector objects) { model.addData(objects);}
public void removeDBObjectAt(int idx) { model.removeDBObjectAt(idx
public DBObject getDBObject(int row) { return(model.getDBObject(r
public Vector getDBObjects() { return(model.getDBObjects(
protected void setSelectedRow(int row) {
if(row < 0)
clearSelection();
else {
clearSelection();
setRowSelectionInterval(ro
}
}
protected void setSelectedCol(int col) {
if(col < 0)
clearSelection();
else {
clearSelection();
setColumnSelectionInterval
}
}
}
class SmartTableModel extends AbstractTableModel {
protected ColumnDescriptor cols[] = {
new ColumnDescriptor("Field1",
new ColumnDescriptor("Field2",
new ColumnDescriptor("Field3",
new ColumnDescriptor("Field4",
new ColumnDescriptor("Field5",
new ColumnDescriptor("Field6",
new ColumnDescriptor("Field7",
new ColumnDescriptor("Field8",
};
protected Vector dbObjects;
public SmartTableModel() {
dbObjects = new Vector();
}
public void addData(Vector v) {
dbObjects.removeAllElement
for(int i = 0; i<v.size(); i++) {
dbObjects.addElement((DBOb
}
updateObjects();
}
public void addDBObject(DBObject dbo) {
dbObjects.addElement(dbo);
updateObjects();
}
public void removeDBObjectAt(int idx) {
dbObjects.removeElementAt(
updateObjects();
}
public DBObject getDBObject(int row) {
return((DBObject)dbObjects
}
public Vector getDBObjects() {
return(dbObjects);
}
protected void updateObjects() {
fireTableDataChanged();
}
public int getColumnCount() { return(cols.length); }
public int getRowCount() { return(dbObjects.size()); }
public String getColumnName(int c) { return(cols[c].name); }
public boolean isCellEditable(int row, int col) { return(true); }
public Object getValueAt(int row, int col) {
if(getRowCount() <= 0)
return "";
if(row<0||row>=getRowCount
return "";
DBObject dbo = (DBObject) dbObjects.elementAt(row);
switch(col) {
case 0: return dbo.f1;
case 1: return dbo.f2;
case 2: return dbo.f3;
case 3: return dbo.f4;
case 4: return dbo.f5;
case 5: return dbo.f6;
case 6: return dbo.f7;
case 7: return dbo.f8;
}
return "";
}
}
class ColumnDescriptor {
public String name;
public int width;
public int alignment;
public ColumnDescriptor(String n, int w, int a) {
name = n;
width = w;
alignment = a;
}
}
class DBObject {
public String f1;
public String f2;
public String f3;
public String f4;
public String f5;
public String f6;
public String f7;
public String f8;
}
public static void main(String[] args) {
SimpleTable t = new SimpleTable();
}
}