Please help.

M

mamta81

I am trying t make a jTable Using Abstract TableModel. But my JTable
doesnot appear on the frame.I have written two classes myTable and
jTable2 .My code is given below:


import javax.swing.*;
import java.awt.*;

public class myTable {
public static void main(String args[]){
JTable2 tbl2=new JTable2();
JTable aTbl=new JTable(tbl2);
aTbl.updateUI();
aTbl.setVisible(true);
JFrame frame=new JFrame("Jtable using AbstractTableModel");
JPanel pan=new JPanel();
JScrollPane scp=new JScrollPane();
scp.add(aTbl);
pan.add(scp);
frame.getContentPane().add(pan);
frame.setVisible(true);
frame.pack();
}

}






import javax.swing.*;
import java.sql.*;
import java.util.*;
import javax.swing.table.*;

public class JTable2 extends AbstractTableModel{
Connection con;
Statement stmt;
ResultSet rs;
int columns;
Vector allRows;
Vector row=new Vector();
String [] columnNames={"ID_CODE","NAME","SECTION"};

public JTable2(){
// connect to database
try{
db_connect();
getData();
}catch(Exception ex){
ex.printStackTrace();
}

}
void db_connect() throws SQLException{
try{
Class.forName("oracle.jdbc.driver.OracleDriver");

con=DriverManager.getConnection("jdbc:eek:racle:thin:mad:158.144.71.242:1521:dbadp","payroll","sush");
System.out.println("Connected");
}catch(Exception ex){
ex.printStackTrace();
}
}
void getData() throws SQLException {
try{
stmt=con.createStatement();
rs=stmt.executeQuery("select idcode,id_name,sec_code from
employee");
ResultSetMetaData rsMetaData=rs.getMetaData();
columns=rsMetaData.getColumnCount();
allRows=new Vector();
while(rs.next()){
Vector newRow=new Vector();
for(int i=1;i<=columns;i++){
newRow.addElement(rs.getObject(i));
}
allRows.addElement(newRow);
}

}catch (Exception ex){
ex.printStackTrace();
}
}
public int getRowCount(){
return allRows.size();
}
public int getColumnCount(){
return columns;
}
public Object getValueAt(int aRow,int aColumn){
row=(Vector) allRows.elementAt(aRow);
return row.elementAt(aColumn);
}
public boolean isCellEditable(int row, int col){
return false;
}

}
 
1

1 connu

You should create your own model (extends AbstractTableModel)
and use it with your JTable (setModel()).
 
R

RedGrittyBrick

mamta81 said:
> I am trying t make a jTable Using Abstract TableModel. But my JTable
> doesnot appear on the frame.I have written two classes myTable and
> jTable2 .My code is given below:
>
>
> public class myTable {
> public static void main(String args[]){
> JTable2 tbl2=new JTable2();

It would be clearer if you named rename JTable2 to employeeTableModel.

> JTable aTbl=new JTable(tbl2);
> aTbl.updateUI();
> aTbl.setVisible(true);

I think those last two statements are unnecessary.
> JFrame frame=new JFrame("Jtable using AbstractTableModel");
> JPanel pan=new JPanel();
> JScrollPane scp=new JScrollPane();
> scp.add(aTbl);
> pan.add(scp);
> frame.getContentPane().add(pan);

I'd replace those five lines with (untested)
frame.add(new JScrollPane(aTbl));

> frame.setVisible(true);
> frame.pack();

You should do those two the other way around
frame.pack();
frame.setVisible(true);

To avoid possible problems, you should use SwingUtilities.invokeLater()
to do all your GUI construction on the Event Dispatch Thread (EDT).

Since constructing your TableModel is slow (see below) you should
probably do that on another Thread - see SwingWorker.
>
> public class JTable2 extends AbstractTableModel{
> Connection con;
> Statement stmt;
> ResultSet rs;
> int columns;
> Vector allRows;
> Vector row=new Vector();
> String [] columnNames={"ID_CODE","NAME","SECTION"};

I'd make all the above private.
I'd use ArrayList instead of Vector.

>
> public JTable2(){
> // connect to database
> try{
> db_connect();
> getData();
> }catch(Exception ex){
> ex.printStackTrace();
> }

You are doing slow database work in your constructor.
I'd exit the program if an Exception is caught when trying to connect to
the database. I doubt it's useful to just continue.

>
> }
> void db_connect() throws SQLException{
> try{
> Class.forName("oracle.jdbc.driver.OracleDriver");
>
> con=DriverManager.getConnection(
> "jdbc:eek:racle:thin:mad:158.144.71.242:1521:dbadp",
> "payroll", "sush");

In a real payroll application you'd get the user to enter their
credentials :)
> System.out.println("Connected");
> }catch(Exception ex){
> ex.printStackTrace();
> }

You declared db_connect() to throw SQLException, so it doesn't make
sense to catch Exception here.
> void getData() throws SQLException {
> try{
> stmt=con.createStatement();
> rs=stmt.executeQuery(
> "select idcode,id_name,sec_code from employee");
> ResultSetMetaData rsMetaData=rs.getMetaData();
> columns=rsMetaData.getColumnCount();

Interesting. Since your SQL is fixed, you don't really need MetaData to
find out columns = 3. I suppose it adds some flexibility to the code
though.
> allRows=new Vector();
> while(rs.next()){
> Vector newRow=new Vector();
> for(int i=1;i<=columns;i++){
> newRow.addElement(rs.getObject(i));
> }
> allRows.addElement(newRow);
> }

I'd define an Employee class with fields for code, name and
securityCode. Then I'd create a new Employee instance using values from
rs.getString() rs.getInt() etc. Finally I'd add the new Employee
instance to my ArrayList<Employee>. Admittedly, this is less flexible.
In a more complex program it may be useful to have Lists of Employees
rather than Vectors of Vectors of plain Objects.
>
> }catch (Exception ex){
> ex.printStackTrace();
> }

You declared getData() to throw SQLException, so it doesn't make sense
to catch Exception here.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,011
Latest member
AjaUqq1950

Latest Threads

Top