Re: Please help.
mamta81 wrote:
> 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:oracle:thin:@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.
> }
> 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;
> }
>
> }