JTable-TableModel
class MyTableModel extends AbstractTableModel
final String columnNames[] = {
"Name", "Value"
String tableData[][];
public MyTableModel()
tableData = new String[1][2];
tableData[0][0] = new String("");
tableData[0][1] = new String("");
public Class getColumnClass(int i)
return getValueAt(0, i).getClass();
public int getColumnCount()
return columnNames.length;
public String getColumnName(int i)
return columnNames;
public int getRowCount()
return tableData.length;
public Object getValueAt(int i, int j)
return tableData[i][j];
public void setValueAt(String value, int row, int col) {
tableData[row][col] = value;
fireTableCellUpdated(row, col);
public boolean isCellEditable(int i, int j)
return true;
myModel=new MyTableModel();
table = new JTable(1,2);
table.setModel(myModel);
JScrollPane tablepane = new JScrollPane(table);
container.add(tablepane);
I want all cells in my table to be editable, and I think I've done everything that is necessary, but somehow it doesn't work. Initially all cells are empty. After I type on a cell and press enter or tab to change to other cell, the cell becomes empty again, the word I type disappears. What could be the problem & how to solve it? Thx.
This looks incorrect.
public Object getValueAt(int i, int j)
return tableData[j];
The object you are returning from getValueAt method is an Array.
Try this:
public Object getValueAt(int i, int j)
return tableData[ i ] [ j ];
Also (this is probably the one that's causing the problems) the
setValueAt() method is not overriding the method you think it
is. The method signature is incorrect. Change this:
public void setValueAt(String value, int row, int col)
tableData[row][col] = value;
fireTableCellUpdated(row, col);
to this:
public void setValueAt(Object value, int row, int col)
if ( value !=null )
tableData[row][col] = value.toString();
I don't think you need the fireTableCellUpdated() method call.
And one more thing (this is just a performance improvement).
You can remove the getColumnClass() method. The implementation
on AbstractTableModel will do the same thing, and it will
do it faster.
later
jc
Similar Messages
-
How to customise Diplay of DateTime in JTable/TableModel
hi all,
If a datetime field in a database table stored as "yyyy-MMM-dd hh:mm:ss". Is it possible for swing JTable/TableModel display the DateTime into a format like "MMM-dd-yyy"?
Please help. :)
regards,
Elvis
scjphi Elvis,
You can display the DateTime in JTable with the format like "MMM-dd-yyyy". All you have to do is grab the date from the database then convert it to the format you like before adding to the table.
Here is the code to convert date format:
SimpleDateFormat sdf = new SimpleDateFormat();
sdf.applyPattern("MMM-dd-yyyy");
String dt = sdf.format(d); // d - the date from database
Hope it helps.
Alex -
Jtable - TableModel Problem while setting rowcount
I have a TableModel which extends from defaulttablemodel
I have a method to set new rows size.
First to call setRowCount I re-create the 'data' Object, that initially has 5 x 5 elements
If I call my function wiht 8 x 5, I get the next fail :
java.lang.ArrayIndexOutOfBoundsException: 5 >= 5
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.justifyRows(Unknown Source)
at javax.swing.table.DefaultTableModel.setNumRows(Unknown Source)
at javax.swing.table.DefaultTableModel.setRowCount(Unknown Source)
at geocost.Wtable.w_setrows(Wtable.java:66)
The code is something like this :
public void w_setrows(int rows, int cols) {
TableModelo.w_Gen_Object(rows,cols);
TableModelo.setRowCount(rows); ( this is the line 66 )
private void w_Gen_Object(int numRows,int numCols){
data = new Object[numRows][numCols];
for (int i=0; i < numRows; i++) {
for (int j=0; j < numCols; j++) {
data[i][j]="";
Whats wrong ?
Thank youI'm going to explain a little more my problem :
I'm developing a Jtable Bean, and I want to have an initial control on the number of columns and rows that are going to be view.
My tablemodel has a getValueAt
public Object getValueAt(int row, int col) {
return data[row][col];
}Initially my data object has, by default, 5 x 5 elements. and all is work fine
The Jtable is correctly viewed.
If I want to have a 7 x 5 model I :
1.- I redefine the data object to 7 rows x 5 columns, and it is ok .
2.- I set the rowcount to 7
At this point at I get the :
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.eclipse.ve.internal.java.vce.launcher.remotevm.JFCLauncher$1.run(JFCLauncher.java:59)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 5 >= 5
at java.util.Vector.elementAt(Unknown Source)
at javax.swing.table.DefaultTableModel.justifyRows(Unknown Source)5
IWAV0052E Invocation Target Exception creating geocost.Wtable
at javax.swing.table.DefaultTableModel.setNumRows(Unknown Source)
at javax.swing.table.DefaultTableModel.setRowCount(Unknown Source)
I must to fire something ? What more I must write ? -
JTable and ResultSet TableModel with big resultset
Hi, I have a question about JTable and a ResultSet TableModel.
I have to develop a swing JTable application that gets the data from a ResultSetTableModel where the user can update the jtable data.
The problem is the following:
the JTable have to contain the whole data of the source database table. Currently I have defined a
a TYPE_SCROLL_SENSITIVE & CONCUR_UPDATABLE statement.
The problem is that when I execute the query the whole ResultSet is "downloaded" on the client side application (my jtable) and I could receive (with big resultsets) an "out of memory error"...
I have investigate about the possibility of load (in the client side) only a small subset of the resultset but with no luck. In the maling lists I see that the only way to load the resultset incrementally is to define a forward only resultset with autocommit off, and using setFetchSize(...). But this solution doesn't solve my problem because if the user scrolls the entire table, the whole resultset will be downloaded...
In my opinion, there is only one solution:
- create a small JTable "cache structure" and update the structure with "remote calls" to the server ...
in other words I have to define on the server side a "servlet environment" that queries the database, creates the resultset and gives to the jtable only the data subsets that it needs... (alternatively I could define an RMI client/server distribuited applications...)
This is my solution, somebody can help me?
Are there others solutions for my problem?
Thanks in advance,
StefanoThe database table currently is about 80000 rows but the next year will be 200000 and so on ...
I know that excel has this limit but my JTable have to display more data than a simple excel work sheet.
I explain in more detail my solution:
whith a distribuited TableModel the whole tablemodel data are on the server side and not on the client (jtable).
The local JTable TableModel gets the values from a local (limited, 1000rows for example) structure, and when the user scroll up and down the jtable the TableModel updates this structure...
For example: initially the local JTable structure contains the rows from 0 to 1000;
the user scroll down, when the cell 800 (for example) have to be displayed the method:
getValueAt(800,...)
is called.
This method will update the table structure. Now, for example, the table structure will contain data for example from row 500 to row 1500 (the data from 0 to 499 are deleted)
In this way the local table model dimension will be indipendent from the real database table dimension ...
I hope that my solution is more clear now...
under these conditions the only solutions that can work have to implement a local tablemodel with limited dimension...
Another solution without servlet and rmi that I have found is the following:
update the local limited tablemodel structure quering the database server with select .... limit ... offset
but, the select ... limit ... offset is very dangerous when the offset is high because the database server have to do a sequential scan of all previuous records ...
with servlet (or RMI) solution instead, the entire resultset is on the server and I have only to request the data from the current resultset from row N to row N+1000 without no queries...
Thanks -
Can not show the JCheckBox in JTable cell
I want to place a JCheckBox in one JTable cell, i do as below:
i want the column "d" be a check box which indicates "true" or "false".
String[] columnNames = {"a","b","c","d"};
Object[][] rowData = {{"", "", "", Boolean.FALSE}};
tableModel = new DefaultTableModel(rowData, columnNames);
dataTable = new JTable(tableModel);
dataTable.getColumnModel().getColumn(3).setCellEditor(new DefaultCellEditor(new JCheckBox()));
But when i run it, the "d" column show the string "false" or "true", not the check box i wanted.
I do not understand it, can you help me?
Thank you very much!
coral9527Do not use DefaultTableModel, create your own table model and you should implement the method
getColumnClass to display the boolean as checkbox ...
I hope the following colde snippet helps you :
class MyModel extends AbstractTableModel {
private String[] columnNames = {"c1",
"c2"};
public Object[][] data ={{Boolean.valueOf(true),"c1d1"}};
public int getColumnCount() {
//System.out.println("Calling getColumnCount");
return columnNames.length;
public int getRowCount() {
//System.out.println("Calling row count");
return data.length;
public String getColumnName(int col) {
return columnNames[col];
public Object getValueAt(int row, int col) {
return data[row][col];
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
* Don't need to implement this method unless your table's
* editable.
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
return true;
* Don't need to implement this method unless your table's
* data can change.
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col); -
Questions about Using Vector To File And JTable
hi all
I want to write all data from Vector To File and read from file To Vector
And I want To show all data from vector to JTable
Note: I'm using the JBuilder Compiler
This is Class A that my datamember And Methods in it
import java.io.*;
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2008</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
public class A implements Serializable {
int no;
String name;
int age;
public void setA (int n,String na,int a)
no=n;
name=na;
age=a;
public void set_no(int n)
no = n;
public void set_age(int a)
age = a;
public int getage ()
return age;
public void setName(String a)
name = a;
public String getname ()
return name;
public int getno ()
return no;
This is The Frame That the JTextFeild And JButtons & JTable in it
import java.awt.*;
import java.io.*;
import java.util.*;
import com.borland.jbcl.layout.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.table.*;
import javax.swing.border.*;
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2008</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
public class Frame1 extends JFrame {
/* Vector v = new Vector ();
public int i=0;*/
A a = new A();
XYLayout xYLayout1 = new XYLayout();
JTextField txtno = new JTextField();
JTextField txtname = new JTextField();
JTextField txtage = new JTextField();
JButton add = new JButton();
JButton search = new JButton();
/*JTable jTable1 = new JTable();
TableModel tableModel1 = new MyTableModel(*/
TableModel dataModel = new AbstractTableModel() {
public int getColumnCount() { return 2; }
public int getRowCount() { return 2;}
public Object getValueAt(int row, int col) { return new A(); }
JTable table = new JTable(dataModel);
JScrollPane scrollpane = new JScrollPane(table);
TitledBorder titledBorder1;
TitledBorder titledBorder2;
ObjectInputStream in;
ObjectOutputStream out;
JButton read = new JButton();
public Frame1() {
try {
jbInit();
catch(Exception e) {
e.printStackTrace();
private void jbInit() throws Exception {
titledBorder1 = new TitledBorder(BorderFactory.createEmptyBorder(),"");
titledBorder2 = new TitledBorder("");
this.getContentPane().setLayout(xYLayout1);
add.setBorder(BorderFactory.createRaisedBevelBorder());
add.setNextFocusableComponent(txtno);
add.setMnemonic('0');
add.setText("Add");
add.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
add_actionPerformed(e);
add.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
add_actionPerformed(e);
search.setFocusPainted(false);
search.setText("Search");
search.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
search_actionPerformed(e);
xYLayout1.setWidth(411);
xYLayout1.setHeight(350);
read.setText("Read");
read.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
read_actionPerformed(e);
this.getContentPane().add(txtno, new XYConstraints(43, 35, 115, 23));
this.getContentPane().add(txtname, new XYConstraints(44, 67, 114, 22));
this.getContentPane().add(txtage, new XYConstraints(44, 97, 115, 23));
this.getContentPane().add(add, new XYConstraints(60, 184, 97, 26));
this.getContentPane().add(search, new XYConstraints(167, 185, 88, 24));
this.getContentPane().add(table, new XYConstraints(187, 24, 205, 119));
this.getContentPane().add(read, new XYConstraints(265, 185, 75, 24));
this.setSize(450,250);
table.setGridColor(new Color(0,0,255));
void add_actionPerformed(ActionEvent e)
a.set_no(Integer.parseInt(txtno.getText()));
a.setName(txtname.getText());
a.set_age(Integer.parseInt(txtage.getText()));
fileOutput();
txtno.setText(null);
txtname.setText(null);
txtage.setText(null);
try
out.writeObject(a);
out.close();
}catch (Exception excep){};
/* try
add.setDefaultCapable(true);
v.addElement(new A());
((A)v.elementAt(i)).setA(Integer.parseInt(txtno.getText()),txtname.getText(),Integer.parseInt(txtage.getText()));
JOptionPane.showMessageDialog(null,"The Record is Added");
txtno.setText(null);
txtname.setText(null);
txtage.setText(null);
i++;
}catch (Exception excep){};*/
void search_actionPerformed(ActionEvent e) {
int n = Integer.parseInt(JOptionPane.showInputDialog("Enter No:"));
for (int i=0;i<v.size();i++)
if (((A)v.elementAt(i)).getno()==n)
txtno.setText(Integer.toString(((A)v.elementAt(i)).getno()));
txtname.setText(((A)v.elementAt(i)).getname() );
txtage.setText(Integer.toString(((A)v.elementAt(i)).getage()));
public void fileOutput()
try
out = new ObjectOutputStream(new FileOutputStream("c:\\UserData.txt",true));
}catch(Exception excep){};
public void fileInput()
try
in = new ObjectInputStream(new FileInputStream("c:\\UserData.txt"));
}catch(Exception excep){};
void read_actionPerformed(ActionEvent e) {
fileInput();
try
a = (A)in.readObject();
txtno.setText(Integer.toString(a.getno()));
txtname.setText(a.getname());
txtage.setText(Integer.toString(a.getage()));
}catch (Exception excep){};
}//program which copies string data between vector and file
import java.util.*;
import java.io.*;
class Util
private Vector v;
private FileReader filereader;
private FileWriter filewriter;
Util(String data[])throws Exception
v=new Vector();
for(String o:data)
v.add(o);
public void listData()throws Exception
int size=v.size();
for(int i=0;i<size;i++)
System.out.println(v.get(i));
public void copyToFile(String data,String fname)throws Exception
filewriter =new FileWriter(fname);
filewriter.write(data);
filewriter.flush();
System.out.println("Vector content copied into file..."+fname);
public void copyFromFile(String fname)throws Exception
filereader=new FileReader(fname);
char fcont[]=new char[(int)new File(fname).length()];
filereader.read(fcont,0,fcont.length);
String temp=new String(fcont);
String fdata[]=temp.substring(1,temp.length()-1).split(",");
for(String s:fdata)
v.add(s.trim());
System.out.println("File content copied into Vector...");
public String getData()throws Exception
return(v.toString());
class TestUtil
public static void main(String a[])throws Exception
String arr[]={"siva","rama","krishna"};
Util util=new Util(arr);
System.out.println("before copy from file...");
util.listData();
String fname=System.getProperty("user.home")+"\\"+"vecdata";
util.copyToFile(util.getData(),fname);
util.copyFromFile(fname);
System.out.println("after copy from file...");
util.listData();
} -
here is the code
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.util.*;
import java.awt.print.PrinterJob;
import java.awt.print.*;
// Java extension packages
import javax.swing.*;
import javax.swing.table.*;
class DisplayQueryResultsDOD extends JFrame implements Printable,ActionListener
ResultSetTableModelDOD tableModel;
JTextArea queryArea;
JTable resultTable;
// create ResultSetTableModel and GUI
DisplayQueryResultsDOD()
super( "Displaying Query Results" );
// Cloudscape database driver class name
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
// URL to connect to books database
String url = "jdbc:odbc:MyDataSource";
// query to select entire authors table
String query = "SELECT * FROM person";
// create ResultSetTableModel and display database table
try
// create TableModel for results of query
// SELECT * FROM authors
tableModel =
new ResultSetTableModelDOD( driver, url, query );
// set up JTextArea in which user types queries
queryArea = new JTextArea( query, 3, 100 );
queryArea.setWrapStyleWord( true );
queryArea.setLineWrap( true );
JScrollPane scrollPane = new JScrollPane( queryArea,
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
// set up JButton for submitting queries
JButton submitButton = new JButton( "Submit Query" );
// create Box to manage placement of queryArea and
Box box = Box.createHorizontalBox();
box.add( scrollPane );
box.add( submitButton );
// create JTable delegate for tableModel
JTable resultTable = new JTable( tableModel );
// place GUI components on content pane
Container c = getContentPane();
c.add( box, BorderLayout.NORTH );
c.add( new JScrollPane( resultTable ),
BorderLayout.CENTER );
// create event listener for submitButton
submitButton.addActionListener(
new ActionListener()
public void actionPerformed( ActionEvent e )
// perform a new query
try
tableModel.setQuery( queryArea.getText() );
// catch SQLExceptions that occur when
// performing a new query
catch ( SQLException sqlException )
JOptionPane.showMessageDialog( null,sqlException.toString(),"Database error",JOptionPane.ERROR_MESSAGE );
} // end actionPerformed
} // end ActionListener inner class
// set window size and display window
JMenuBar menuBar = new JMenuBar();
JMenu filemenu= new JMenu("File");
JMenu submenux=new JMenu("Open");
JMenuItem np=new JMenuItem("Launch Panel");
submenux.add(np);
//openmenuitem.addActionListener(this);
submenux.setActionCommand("Open");
submenux.setMnemonic('O');
filemenu.add(submenux);
menuBar.add(filemenu);
JMenuItem printItem = new JMenuItem("Print");
printItem.setMnemonic('P');
filemenu.add(printItem);
JMenuItem ExitItem = new JMenuItem("Exit");
ExitItem.setMnemonic('x');
filemenu.add(ExitItem);
JMenu viewmenu=new JMenu("View");
JMenuItem repItem=new JMenuItem("Reports");
JMenu submenu=new JMenu("sort by");
submenu.add(new JMenuItem("Marital Status"));
submenu.add(new JMenuItem("Rank"));
submenu.add(new JMenuItem("Tribe"));
submenu.add(new JMenuItem("Educational Level"));
viewmenu.add(submenu);
menuBar.add(viewmenu);
setJMenuBar(menuBar);
printItem.addActionListener(this);
ExitItem.addActionListener
new ActionListener()
public void actionPerformed(ActionEvent ae)
System.exit(0);
setSize( 1500,900);
// setVisible( true );
} // end try
// catch ClassNotFoundException thrown by
// ResultSetTableModel if database driver not found
catch ( ClassNotFoundException classNotFound )
JOptionPane.showMessageDialog( null,"Cloudscape driver not found", "Driver not found",JOptionPane.ERROR_MESSAGE );
System.exit( 1 ); // terminate application
// catch SQLException thrown by ResultSetTableModel
// if problems occur while setting up database
// connection and querying database
catch ( SQLException sqlException )
JOptionPane.showMessageDialog( null,sqlException.toString(),"Database error", JOptionPane.ERROR_MESSAGE );
System.exit( 1 ); // terminate application
} // end DisplayQueryResults constructor
public void actionPerformed(ActionEvent e)
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(this);
if (printJob.printDialog())
try
printJob.print();
catch (Exception ex)
ex.printStackTrace();
public int print(Graphics g, PageFormat pf, int page) throws
PrinterException {
if (page > 0) { /* We have only one page, and 'page' is zero-based */
return NO_SUCH_PAGE;
/* User (0,0) is typically outside the imageable area, so we must
* translate by the X and Y values in the PageFormat to avoid clipping
Graphics2D g2d = (Graphics2D)g;
g2d.translate(pf.getImageableX(), pf.getImageableY());
/* Now print the window and its visible contents */
resultTable.printAll(g);
/* tell the caller that this page is part of the printed document */
return PAGE_EXISTS;
// execute application
public static void main( String args[] )
DisplayQueryResultsDOD app = new DisplayQueryResultsDOD();
app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
} // end class DisplayQueryResults
I get an exception
pls helpI included this statement only to check if it would print or not, because before that I tried printing the table without setting the size. Anyway, when I tried the same code under Windows it worked fine. Talking about platform independent...:-)
-
How can i add rows to a JTable at run time ??????
hi there
how can i add a row to a JTable at run time? and display the table after the change? thank you.For adding or removing the rows from the JTable, you have to use the methods on the table model. I would show you a simple implementation of table model.
public class MyTableModel extends AbstractTableModel {
private ArrayList rowsList = null;
private String [] columns = { "Column 1" , "Column 2", "Column 3"};
public MyTableModel() {
rowsList = new ArrayList();
public int getRowCount() {
return rowsList.size();
public int getColumnCount() {
return columns.length;
public void addRow(MyRow myRow) {
//MyRow is any of your object.
rowsList.add(myRow);
fireTableDataChanged();
public void removeRow(int rowIndex) {
rowsList.remove(rowIndex);
fireTableRowsDeleted(rowIndex, rowIndex);
public Object getValueAt(int row, in col) {
MyRow currentRow = (MyRow)rowsList.get(row);
switch (col) {
case 0:
//return the value of first cell
break;
case 1 :
//return the value of second cell
break;
case 2 :
//return the value of third cell
break;
}Then create the table using the TableModel using the constructor new JTable(TableModel) and then when you want to add/remove a row from the table, call myTableModel.addRow(MyRow) or myTableModel.removeRow(rowIndex)....I hope that this solves your problem. -
How to write an element in a JTable Cell
Probably it's a stupid question but I have this problem:
I have a the necessity to build a JTable in which, when I edit a cell and I push a keyboard button, a new Frame opens to edit the content of the cell.
But the problem is how to write something in the JTable cell, before setting its model. Because, I know, setCellAT() method of JTree inserts the value in the model and not in the table view. And repainting doesn't function!
What to do??
ThanksHi there
Depending on your table model you should normally change the "cell value" of the tablemodel.
This could look like:
JTable table = new JTable();
TableModel model = table.getModel();
int rowIndex = 0, columnIndex = 0;
model.setValueAt("This is a test", rowIndex, columnIndex);
The tablemodel should then fire an event to the view (i.e. JTable) and the table should be updated.
Hope this helps you -
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 PMWhy 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. -
To change the font of a selected row in a Jtable
Hello,
Is it possible to change the font of a selected row in a jtable?
i.e. if all the table is set to a bold font, how would you change the font of the row selected to a normal (not bold) font?
thank you.String will be left justified
Integer will be right justified
Date will be a simple date without the time.
As it will with this renderer.Only if your custom renderer duplicates the code
found in each of the above renderers. This is a waste
of time to duplicate code. The idea is to reuse code
not duplicate and debug again.
No, no, no there will be NO duplicated code.
A single renderer class can handle all types ofdata.
Sure you can fit a square peg into a round hole if
you work hard enough. Why does the JDK come with
separate renderers for Date, Integer, Double, Icon,
Boolean? So that, by default the rendering for common classes is done correctly.
Because its a better design then having code
with a bunch of "instanceof" checks and nested
if...else code.This is only required for customization BEYOND what the default renderers provide
>
And you would only have to use instanceof checkswhen you required custom
rendering for a particular classAgreed, but as soon as you do require custom
renderering you need to customize your renderer.
which you would also have to do with theprepareRenderer calls too
Not true. The code is the same whether you treat
every cell as a String or whether you use a custom
renderer for every cell. Here is the code to make the
text of the selected line(s) bold:
public Component prepareRenderer(TableCellRenderer
renderer, int row, int column)
Component c = super.prepareRenderer(renderer, row,
, column);
if (isRowSelected(row))
c.setFont( c.getFont().deriveFont(Font.BOLD) );
return c;
}It will work for any renderer used by the table since
the prepareRenderer(...) method returns a Component.
There is no need to do any kind of "instanceof"
checking. It doesn't matter whether the cell is
renderered with the "Object" renderer or the
"Integer" renderer.
If the user wants to treat all columns as Strings or
treat individual columns as String, Integer, Data...,
then they only need to override the getColumnClass()
method. There is no change to the prepareRenderer()
code.
Have you actually tried the code to see how simple it
is?
I've posted my code. Why don't you post your solution
that will allow the user to bold the text of a Date,
Integer, and String data in separate column and then
let the poster decide.Well, I don't see a compilable, runnable demo anywhere in this thread. So here's one
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Vector;
public class TableRendererDemo extends JFrame{
String[] headers = {"String","Integer","Float","Boolean","Date"};
private JTable table;
public TableRendererDemo() {
buildGUI();
private void buildGUI() {
JPanel mainPanel = (JPanel) getContentPane();
mainPanel.setLayout(new BorderLayout());
Vector headerVector = new Vector(Arrays.asList(headers));
Vector data = createDataVector();
DefaultTableModel tableModel = new DefaultTableModel(data, headerVector){
public Class getColumnClass(int columnIndex) {
return getValueAt(0,columnIndex).getClass();
table = new JTable(tableModel);
// table.setDefaultRenderer(Object.class, new MyTableCellRenderer());
table.setDefaultRenderer(String.class, new MyTableCellRenderer());
table.setDefaultRenderer(Integer.class, new MyTableCellRenderer());
table.setDefaultRenderer(Float.class, new MyTableCellRenderer());
table.setDefaultRenderer(Date.class, new MyTableCellRenderer());
JScrollPane jsp = new JScrollPane(table);
mainPanel.add(jsp, BorderLayout.CENTER);
pack();
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
private Vector createDataVector(){
Vector dataVector = new Vector();
for ( int i = 0 ; i < 10; i++){
Vector rowVector = new Vector();
rowVector.add(new String("String "+i));
rowVector.add(new Integer(i));
rowVector.add(new Float(1.23));
rowVector.add( (i % 2 == 0 ? Boolean.TRUE : Boolean.FALSE));
rowVector.add(new Date());
dataVector.add(rowVector);
return dataVector;
public static void main(String[] args) {
Runnable runnable = new Runnable() {
public void run() {
TableRendererDemo tableRendererDemo = new TableRendererDemo();
tableRendererDemo.setVisible(true);
SwingUtilities.invokeLater(runnable);
class MyTableCellRenderer extends DefaultTableCellRenderer{
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if ( isSelected){
setFont(getFont().deriveFont(Font.BOLD));
else{
setFont(getFont().deriveFont(Font.PLAIN));
if ( value instanceof Date){
SimpleDateFormat formatter =(SimpleDateFormat) SimpleDateFormat.getDateInstance(DateFormat.MEDIUM);
setText(formatter.format((Date)value));
if(value instanceof Number){
setText(((Number)value).toString());
return this;
}Hardly a "bunch of instanceof or nested loops. I only used the Date instanceof to allow date format to be specified/ modified. If it was left out the Date column would be "18 Apr 2005" ( DateFormat.MEDIUM, which is default).
Cheers
DB -
Trying to set a JLabel off of a JTable
Hi! I am trying to let a user select a row from a Jtable and have those highlighted values displayed below in another panel. Problem is that the gui never seems to refresh. Any ideas?
public class MainClass{
public static void main( String[] args ){
JFrame mainFrame = new JFrame( "Main Class" );
MyTableModel tableModel = new MyTableModel();
JTable table = new JTable( tableModel );
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener( new PanelModel() );
JScrollPane tableScrollPane = new JScrollPane( table );
tableScrollPane.setPreferredSize( new Dimension( 80, 80 ) );
PanelView panelView = new PanelView();
JScrollPane panelScrollPane = new JScrollPane( panelView );
panelScrollPane.setPreferredSize( new Dimension(80, 80) );
mainFrame.getContentPane().add( tableScrollPane, BorderLayout.NORTH );
mainFrame.getContentPane().add( panelScrollPane, BorderLayout.SOUTH );
mainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
mainFrame.pack();
mainFrame.setVisible( true );
public class PanelModel implements ListSelectionListener{
private String anything;
MyTableModel tableModel = new MyTableModel();
public void valueChanged(ListSelectionEvent lse) {
if (lse.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)lse.getSource();
if (lsm.isSelectionEmpty()) {
//no rows are selected
} else {
int selectedRow = lsm.getMinSelectionIndex();
String rowValue = (String)tableModel.getValueAt(selectedRow, 0);
this.populate( rowValue );
public void populate(String something){
this.setAnything(something);
PanelView myPanelView = new PanelView();
myPanelView.RowInfoField.setText(this.getAnything());
myPanelView.updateUI();
public String getAnything() {
return this.anything;
public void setAnything( String anything ) {
this.anything = anything;
public class MyTableModel extends AbstractTableModel{
private String[] columns = {"Column 1"};
private String[][] rows = { {"Something"}, {"Anything"} };
private static int selectedRow;
public int getColumnCount(){
return columns.length;
public int getRowCount(){
return rows.length;
public int getSelectedRow(){
return selectedRow;
public Object getValueAt(int r, int c){
if(rows[r] != null && columns[c] != null){
return rows[r][c];
return null;
public class PanelView extends JPanel{
MyTableModel tm;
int rowSelected = 0;
private String rowInfo;
JLabel RowInfoField;
JLabel RowInfoLabel;
JPanel panelModel;
public PanelView() {
panelModel = new JPanel( new GridLayout() );
tm = new MyTableModel();
rowSelected = tm.getSelectedRow();
rowInfo = (String)tm.getValueAt(rowSelected,0);
JLabel RowInfoLabel = new JLabel( "RowInfo " );
RowInfoLabel.setForeground( Color.black );
RowInfoField = new JLabel(rowInfo);
RowInfoField.setFont( new Font( "Serif", 1, 11 ) );
panelModel.add( RowInfoLabel );
panelModel.add( RowInfoField );
this.add( panelModel );
this.setEnabled( true );
}The problem is in the PanelModel.java line 24. Every time you create new PanelView but not add to the Frame. Following is a quick fix.
PanelModel.java
===================================================================
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
public class PanelModel implements ListSelectionListener{
private String anything;
MyTableModel tableModel = new MyTableModel();
public void valueChanged(ListSelectionEvent lse) {
if (lse.getValueIsAdjusting()) return;
ListSelectionModel lsm = (ListSelectionModel)lse.getSource();
if (lsm.isSelectionEmpty()) {
//no rows are selected
} else {
int selectedRow = lsm.getMinSelectionIndex();
String rowValue = (String)tableModel.getValueAt(selectedRow, 0);
this.populate( rowValue );
public void populate(String something){
System.out.println("something: " + something);
this.setAnything(something);
MainClass.panelView.RowInfoField.setText(this.getAnything());
// PanelView myPanelView = new PanelView();
// myPanelView.RowInfoField.setText(this.getAnything());
// myPanelView.updateUI();
public String getAnything() {
return this.anything;
public void setAnything( String anything ) {
this.anything = anything;
===================================================================
MainClass.java
===================================================================
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
public class MainClass{
public static PanelView panelView;
public static void main( String[] args ){
JFrame mainFrame = new JFrame( "Main Class" );
MyTableModel tableModel = new MyTableModel();
JTable table = new JTable( tableModel );
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
ListSelectionModel rowSM = table.getSelectionModel();
rowSM.addListSelectionListener( new PanelModel() );
JScrollPane tableScrollPane = new JScrollPane( table );
tableScrollPane.setPreferredSize( new Dimension( 80, 80 ) );
panelView = new PanelView();
JScrollPane panelScrollPane = new JScrollPane( panelView );
panelScrollPane.setPreferredSize( new Dimension(80, 80) );
mainFrame.getContentPane().add( tableScrollPane, BorderLayout.NORTH );
mainFrame.getContentPane().add( panelScrollPane, BorderLayout.SOUTH );
mainFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
mainFrame.pack();
mainFrame.setVisible( true );
===================================================================
MyTableModel.java
===================================================================
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
import javax.swing.table.*;
public class MyTableModel extends AbstractTableModel{
private String[] columns = {"Column 1"};
private String[][] rows = { {"Something"}, {"Anything"} };
private static int selectedRow;
public int getColumnCount(){
return columns.length;
public int getRowCount(){
return rows.length;
public int getSelectedRow(){
return selectedRow;
public Object getValueAt(int r, int c){
if(rows[r] != null && columns[c] != null){
return rows[r][c];
return null;
===================================================================
PanelView.java
===================================================================
import javax.swing.*;
import java.awt.*;
import javax.swing.event.*;
import java.awt.event.*;
public class PanelView extends JPanel{
MyTableModel tm;
int rowSelected = 0;
private String rowInfo;
JLabel RowInfoField;
JLabel RowInfoLabel;
JPanel panelModel;
public PanelView() {
panelModel = new JPanel( new GridLayout() );
tm = new MyTableModel();
rowSelected = tm.getSelectedRow();
rowInfo = (String)tm.getValueAt(rowSelected,0);
JLabel RowInfoLabel = new JLabel( "RowInfo " );
RowInfoLabel.setForeground( Color.black );
RowInfoField = new JLabel(rowInfo);
RowInfoField.setFont( new Font( "Serif", 1, 11 ) );
panelModel.add( RowInfoLabel );
panelModel.add( RowInfoField );
this.add( panelModel );
this.setEnabled( true );
=================================================================== -
I am trying to delete a row from a JTable whenever the button on the last column is pressed. I know to do this, I can use the removeRow(int) method of the tableModel. But the odd thing is when I try to get a handle to the TableModel from the JTable to use that function, i.e. table.getModel().removeRow(int) it doesn't work. But if I explicitly pass in the tableModel into my class it does work. Here's the code below:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.AbstractCellEditor;
import javax.swing.table.DefaultTableModel;
public class tester4 extends JFrame
protected final int BUTTON_COL = 2;
private TableCellRenderer defaultRenderer;
private TableCellEditor defaultEditor;
private JTable workingTable;
private String[] transactionCols = {"Qty", "Product", "Cancel"};
private Object[][] data = {{5, "prod1", "Cancel"},
{6, "prod2", "Cancel"},
{7, "prod3", "Cancel"}};
public tester4()
workingTable = new JTable(tableModel);
workingTable.setName("Working Table");
defaultRenderer = workingTable.getDefaultRenderer(JButton.class);
defaultEditor = workingTable.getDefaultEditor(Object.class);
StatusTableRenderer testRenderer = new StatusTableRenderer(defaultRenderer, defaultEditor, workingTable, tableModel);
workingTable.setDefaultRenderer(Object.class, testRenderer);
workingTable.setDefaultEditor(Object.class, testRenderer);
JScrollPane scrollPane = new JScrollPane( workingTable );
getContentPane().add( scrollPane );
private DefaultTableModel tableModel = new DefaultTableModel(data, transactionCols){
// Only allow button column to be editable, if there is an actual
// button in that row
public boolean isCellEditable(int row, int col){
return (col == BUTTON_COL && data[row][col] != "") ? true : false;
// Overriden getColumnClass method that will return the object
// class type of the first instance of the data type otherwise
// returns the Object.class
public Class getColumnClass(int column){
for (int row = 0; row < getRowCount(); row++){
Object o = getValueAt(row, column);
if (o != null){ return o.getClass(); }
return Object.class;
public static void main(String[] args)
tester4 frame = new tester4();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible(true);
public class StatusTableRenderer extends AbstractCellEditor
implements TableCellRenderer,
TableCellEditor,
ActionListener{
private TableCellRenderer defaultRenderer;
private TableCellEditor defaultEditor;
private JButton cancelButton;
private JButton editButton;
private String text;
private int buttonColumn;
private int selectedRow;
private JTable table;
private DefaultTableModel tableModel;
public StatusTableRenderer(TableCellRenderer renderer,
TableCellEditor editor,
JTable table,
DefaultTableModel tableModel){
defaultRenderer = renderer;
defaultEditor = editor;
this.table = table;
this.tableModel = tableModel;
buttonColumn = table.getColumnCount() - 1;
cancelButton = new JButton();
editButton = new JButton();
editButton.setFocusPainted(true);
editButton.addActionListener(this);
public StatusTableRenderer(TableCellRenderer renderer,
TableCellEditor editor,
JTable table,
DefaultTableModel tableModel,
int _buttonColumn){
this(renderer, editor, table, tableModel);
buttonColumn = _buttonColumn;
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
if (column == buttonColumn){
if (hasFocus){
cancelButton.setForeground(table.getForeground());
cancelButton.setBackground(UIManager.getColor("Button.background"));
else if (isSelected){
cancelButton.setForeground(table.getSelectionForeground());
cancelButton.setBackground(table.getSelectionBackground());
else{
cancelButton.setForeground(table.getForeground());
cancelButton.setBackground(UIManager.getColor("Button.background"));
cancelButton.setText( (value == null) ? "" : value.toString() );
return cancelButton;
return defaultRenderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
public Component getTableCellEditorComponent(JTable table, Object value,
boolean isSelected, int row, int column){
if (column == buttonColumn){
text = ((value == null) ? "": value.toString());
editButton.setText(text);
selectedRow = row;
return editButton;
return defaultEditor.getTableCellEditorComponent(
table, value, isSelected, row, column);
public Object getCellEditorValue()
return text;
public void actionPerformed(ActionEvent e)
fireEditingStopped();
// This works
tableModel.removeRow(selectedRow);
// This does not work
// table.getModel().removeRow(selectedRow);
}Take a look at the actionPerfformed method. One way of doing it works, one doesn't. Just trying to understand why me getting a handle to the tableModel through the table doesn't work.
Message was edited by:
deadseasquirrelsIt gives me a run-time error Well then your question should be "why do I get this run-time error" and then you would quote the error. Be more descriptive. "It doesn't work" is not descriptive.
table.getModel().removeRow(selectedRow);I don't use JDK1.5 either. But if you are saying that the above line compiles cleanly with JDK1.5 (because of the auto-boxing feature, or whatever its called), then I see no reason why the code wouldn't work since it recognizes the class as a DefaultTableModel.
Presumably you commented out the other line so you don't try to delete the row twice. Otherwise you might be getting a indexing error. -
Combo Box in a JTable not appearing
Hi Swing,
I have a snippet of code that I took from the Swing guide for JTables that adds a JComboBox into the 3rd column in the table. However, the ComboBox doesnt appear?
Can anyone see what is going wrong? Code is below:- I can post more if needed:-
public void addTable() {
tableModel = new MyTableModel(rows,columns);
relationTable = new JTable(tableModel);
//Set up the editor for the sport cells.
TableColumn sportColumn = table.getColumnModel().getColumn(2);
JComboBox allStaff = new JComboBox();
allStaff.addItem("Snowboarding");
allStaff.addItem("Rowing");
allStaff.addItem("Knitting");
allStaff.addItem("Speed reading");
allStaff.addItem("Pool");
allStaff.addItem("None of the above");
sportColumn.setCellEditor(new DefaultCellEditor(allStaff));
// set so only one row can be selected at once
relationTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );
relationTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// add to pane:-
JScrollPane scrollPane3 = new JScrollPane(relationTable);
scrollPane3.setBounds(X,Y,Z,W);
getContentPane().add(scrollPane3 );
}Cheershi
look I will give u a simple code I created based on your combo box
enjoy (:
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
public class TablCo extends JPanel {
static JFrame frame;
JTable table;
DefaultTableModel tm;
public TablCo() {
super(new BorderLayout());
JPanel leftPanel = createVerticalBoxPanel();
//Create a table model.
tm = new DefaultTableModel();
tm.addColumn("Column 0");
tm.addColumn("Column 1");
tm.addColumn("Column 2");
tm.addColumn("Column 3");
tm.addRow(new String[]{"01", "02", "03", "Snowboarding"});
tm.addRow(new String[]{"04 ", "05", "06", "Snowboarding"});
tm.addRow(new String[]{"07", "08", "09", "Snowboarding"});
tm.addRow(new String[]{"10", "11", "12", "Snowboarding"});
//Use the table model to create a table.
table = new JTable(tm);
//insert a combo box in table
TableColumn sportColumn = table.getColumnModel().getColumn(3);
JComboBox allStaff = new JComboBox();
allStaff.addItem("Snowboarding");
allStaff.addItem("Rowing");
allStaff.addItem("Knitting");
allStaff.addItem("Speed reading");
allStaff.addItem("Pool");
allStaff.addItem("None of the above");
//DefaultCellEditor dce = new DefaultCellEditor(allStaff);
sportColumn.setCellEditor(new DefaultCellEditor(allStaff));
JScrollPane tableView = new JScrollPane(table);
tableView.setPreferredSize(new Dimension(300, 100));
leftPanel.add(createPanelForComponent(tableView, "JTable"));
JFrame.setDefaultLookAndFeelDecorated(true);
//Create and set up the window.
frame = new JFrame("BasicDnD");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
frame.setContentPane(leftPanel);
//Display the window.
frame.pack();
frame.setVisible(true);
protected JPanel createVerticalBoxPanel() {
JPanel p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
return p;
public JPanel createPanelForComponent(JComponent comp,
String title) {
JPanel panel = new JPanel(new BorderLayout());
panel.add(comp, BorderLayout.CENTER);
if (title != null) {
panel.setBorder(BorderFactory.createTitledBorder(title));
return panel;
public static void main(String[] args) {
new TablCo();
} -
JTable - how to disable the drag / move for column
hi there, please give me a hand with this problem,
i am trying to disable drag / move column in JTable.
ie.
===============================================================
JTable mainTable = new JTable();
tableModel recordTable; //this extand AbstractTableModel
this.mainTable.setModel(this.recordTable);
ie.
Product size quantity price
Shoe 8 200 $120
Shirt 9 100 $100
Dress 12 50 $60
the position of column Product,size,quantity,price, however, if i click on price and drag, i will be able to move the whole lot and place to different position ie. Product,price,size,quantity.
=======================================================================
please let me know how can i stop this happening....Try something like this:
mainTable.getTableHeader().setReorderingAllowed(false);
Maybe you are looking for
-
Hi, My customer has had an issue with Dunning Letters mixing up the transactions' posting dates. This issue has now been resolved by upgrading to PL44. However, they have run and executed several Dunning runs in testing this issue (don't ask me why!
-
Very strange it appears that I am now on FF (I thought I was on Netscape) but it took 10 minutes + to get FF to open. Up until then I could not get it to open even after multiple tries. Looked at Tasks running and FF did not show even after multiple
-
How to zero-write free disk space?
Hello: I need to zero write the free space of the hard disk to ensure that data is erased and because im using a virtual hard disk and i need to zero off free space to be able to compact the disk how can I do that? is there any command to do that ? t
-
How do you port forward a dvr home security camera using Actiontec Wi424wr router
I been on this for days now. I viewed the videos, I read the websites and I'm still not able to remotely view my camera. Is there a step I am missing? Do I have to make a change in the Windows program too? ActionTec and Verizon what am I'm missi
-
What's the best way to transfer 11,000 photo's from my old mac to my new one?
What's the best way to transfer 11,000 photo's on iphoto to iphoto on my new mac. I've just spent 24 hours importing them onlu for it to say there is not enough space available - BUT I'VE JUST BOUGHT AN NEW UPGRADED MAC?