Trouble with TableModel
I have the following code that generates a desktop with a menu selection that opens an internal frame. The internal frame prompts the user for an item number and when you press find it should update the jtable on the internal frame. Please, I am an extreme newbie so if you could provide specific examples of what I am doing wrong I would greatly appreciate it.
import javax.swing.JInternalFrame;
import javax.swing.JDesktopPane;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.*;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.util.*;
import java.sql.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
publicclass TestDesktopextends JFrame{
JDesktopPane desktop;
boolean itemCostOpen =false;
FlowLayout left =new FlowLayout(FlowLayout.LEFT);
JTable jtable =new JTable();
JScrollPane scroller =new JScrollPane();
JTextField itemValue =new JTextField(15);
public TestDesktop(){
int inset = 50;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setBounds(inset, inset, screenSize.width - inset*2, screenSize.height
- inset*2);
addWindowListener(new WindowAdapter(){
publicvoid windowClosing(WindowEvent e){
System.exit(0);
}
});
desktop =new JDesktopPane();
setContentPane(desktop);
setJMenuBar(createMenuBar());
desktop.putClientProperty("JDesktopPane.dragMode","outline");
}
protected JMenuBar createMenuBar(){
JMenuBar menuBar =new JMenuBar();
JMenu item =new JMenu("Item Maintenance");
JMenuItem itemItemCost =new JMenuItem("Item Cost");
itemItemCost.addActionListener(new ActionListener(){
publicvoid actionPerformed(ActionEvent e){
if (!itemCostOpen)
createItemCostFrame();
}
});
item.add(itemItemCost);
menuBar.add(item);
return menuBar;
}
protectedvoid createItemCostFrame(){
itemCostOpen =true;
final ItemCostFrame frame =new ItemCostFrame();
desktop.add(frame);
JButton close =new JButton("Close");
JButton find =new JButton("Find");
JLabel itemLabel =new JLabel("Item Number");
JPanel topPane =new JPanel();
topPane.setLayout(left);
topPane.add(itemLabel);
topPane.add(itemValue);
topPane.add(find);
close.addActionListener(new ActionListener(){
publicvoid actionPerformed(ActionEvent e){
itemCostOpen =false;
frame.setVisible(false);
frame.dispose();
}
});
find.addActionListener(new ActionListener(){
publicvoid actionPerformed(ActionEvent e){
frame.remove(jtable);
int item2 = Integer.parseInt(itemValue.getText());
jtable = searchItemCost(item2);
}
});
jtable = searchItemCost(87654321);
scroller =new JScrollPane(jtable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
frame.getContentPane().add(topPane, BorderLayout.NORTH);
frame.getContentPane().add(scroller, BorderLayout.CENTER);
frame.getContentPane().add(close, BorderLayout.SOUTH);
frame.pack();
frame.setVisible (true);
}
protected JTable searchItemCost(int item){
JTable jtable =new JTable ();
try{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql:" +
"//localhost/jpos_data?user=root&password=squeeky");
// create db table to use
String tableName ="itemcost";
// get a model for this db table and add to a JTable
TableModel mod =new JDBCTableModel (conn, tableName, item);
jtable =new JTable (mod);
}catch (Exception e){
e.printStackTrace();
}
return(jtable);
}
publicstaticvoid main(String[] args){
TestDesktop frame =new TestDesktop();
frame.setVisible(true);
}
}
class ItemCostFrameextends JInternalFrame{
staticint openFrameCount = 0;
staticfinalint xOffset = 30, yOffset = 30;
public ItemCostFrame(){
super("Item Cost Frame",
true,//resizable
false,//closable
true,//maximizable
true);//iconifiable
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
//...Create the GUI and put it in the window...
//...Then set the window size or call pack...
setSize(300,300);
++openFrameCount;
repaint();
//Set the window's location.
setLocation(xOffset*1, yOffset*1);
}
}
class JDBCTableModelextends AbstractTableModel{
Object[][] contents;
String[] columnNames;
Class[] columnClasses;
public JDBCTableModel (Connection conn, String tableName,int item)throws SQLException{
super();
getTableContents (conn, tableName, item);
}
protectedvoid getTableContents (Connection conn, String tableName,int item)throws SQLException{
// get metadata: what columns exist and what
// types (classes) are they?
DatabaseMetaData meta = conn.getMetaData();
System.out.println ("got meta = " + meta);
ResultSet results =
meta.getColumns (null, null, tableName,null) ;
System.out.println ("got column results");
ArrayList colNamesList =new ArrayList();
ArrayList colClassesList =new ArrayList();
while (results.next()){
colNamesList.add (results.getString ("COLUMN_NAME"));
System.out.println ("name: " +
results.getString ("COLUMN_NAME"));
int dbType = results.getInt ("DATA_TYPE");
switch (dbType){
case Types.INTEGER:
colClassesList.add (Integer.class);break;
case Types.FLOAT:
colClassesList.add (Float.class);break;
case Types.DOUBLE:
case Types.REAL:
colClassesList.add (Double.class);break;
case Types.DATE:
case Types.TIME:
case Types.TIMESTAMP:
colClassesList.add (java.sql.Date.class);break;
default:
colClassesList.add (String.class);break;
};
System.out.println ("type: " +
results.getInt ("DATA_TYPE"));
}
columnNames =new String [colNamesList.size()];
colNamesList.toArray (columnNames);
columnClasses =new Class [colClassesList.size()];
colClassesList.toArray (columnClasses);
// get all data from table and put into
// contents array
Statement statement = conn.createStatement ();
results = statement.executeQuery ("SELECT * FROM " +
tableName +" WHERE itemID = " + item);
System.out.println(item);
ArrayList rowList =new ArrayList();
while (results.next()){
ArrayList cellList =new ArrayList();
for (int i = 0; i<columnClasses.length; i++){
Object cellValue =null;
if (columnClasses[i] == String.class)
cellValue = results.getString (columnNames[i]);
elseif (columnClasses[i] == Integer.class)
cellValue =new Integer (results.getInt (columnNames[i]));
elseif (columnClasses[i] == Float.class)
cellValue =new Float (results.getInt (columnNames[i]));
elseif (columnClasses[i] == Double.class)
cellValue =new Double (results.getDouble (columnNames[i]));
elseif (columnClasses[i] == java.sql.Date.class)
cellValue = results.getDate (columnNames[i]);
else
System.out.println ("Can't assign " + columnNames[i]);
cellList.add (cellValue);
}// for
Object[] cells = cellList.toArray();
rowList.add (cells);
}// while
// finally create contents two-dim array
contents =new Object[rowList.size()] [];
for (int i=0; i><contents.length; i++){
contents[i] = (Object []) rowList.get (i);
fireTableDataChanged();
}
System.out.println ("Created model with " + contents.length +" rows");
// close stuff
results.close();
statement.close();
}
// AbstractTableModel methods
publicint getRowCount(){
return contents.length;
}
publicint getColumnCount(){
if (contents.length == 0)
return 0;
else
return contents[0].length;
}
public Object getValueAt (int row,int column){
return contents [row][column];
}
// overrides methods for which AbstractTableModel
// has trivial implementations
public Class getColumnClass (int col){
return columnClasses [col];
}
public String getColumnName (int col){
return columnNames [col];
}
}
>

