1

I am trying to include a refresh button on a Swing library interface, the purpose of the button is to refresh the the contents of a JTable after a Add/Delete/Update query has been called. I've done some research and seen that the tableDataChanged() from the AbstractTableModel class. The problem is I'm not sure where this should be called. I'm using the DefaultTableModel, so I believe this method can also be used.

/*This is where I create the query and add the JTable to a scrollPane, an ResultsPanel
 object is then added to a JFrame object*/




 public class SitePanel extends JPanel implements Constants  {
 ResultsPanel resultsPanel = new ResultsPanel();
   JTable table;
   DefaultTableModel model;
   JPanel sitePanel = new JPanel();
   JPanel results = new JPanel();

   public SitePanel(){
addComponents();
}

public void addComponents(){
    sitePanel.setLayout(new BorderLayout());
    sitePanel.add(buttonPanel, BorderLayout.NORTH);
    sitePanel.add(resultsPanel, BorderLayout.CENTER);
    sitePanel.setVisible(true);
    add(new JScrollPane(sitePanel));
}

 class ButtonPanel extends JPanel{
 JPanel buttons = new JPanel();

       public ButtonPanel(){
      buttons.setLayout(new FlowLayout());
      buttons.add(refreshButton);
      show();
      buttons.setVisible(true);
      add(buttons);

    }
  public void show(){

  refreshButton.addActionListener(new ActionListener(){
   @Override
            public void actionPerformed(ActionEvent arg0) {
                new ResultsPanel();
                table.setModel(model);
            }
        }
                );
 }
 public class ResultsPanel extends JPanel{


     public ResultsPanel(){

        execute();
        results.add(scrollPane);
        javax.swing.SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                results.setBorder(greenB);
                results.setToolTipText("Results");
                results.setVisible(true);
                add(results);

            }
        });
    }

        public void execute() {
        Vector columnNames = new Vector();
        Vector data = new Vector();

        try{
            Connection conn = Connect.getConnection();
            String query = "Select Name from Location Order By Name";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(query);
            ResultSetMetaData md = rs.getMetaData();
            int columns = md.getColumnCount();

            for (int i=1; i<=columns;i++){
                columnNames.addElement(md.getColumnName(i));
            }       
            while (rs.next()){
                Vector row = new Vector(columns);

                for(int i=1; i<=columns;i++){   
                    row.addElement(rs.getObject(i));
                }
                data.addElement(row);
            }
            rs.close();
            stmt.close();
            conn.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }
        model = new DefaultTableModel(data, columnNames);

        model.addTableModelListener(table);
        table = new JTable(model){
            public boolean isCellEditable(int row, int col){
                return false;
            }

            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;
            }
        };

        scrollPane = new JScrollPane(table);
        scrollPane.setBorder(border);
        scrollPane.getVerticalScrollBar().setBackground(Color.LIGHT_GRAY);
    }
}

           }

This is the class with the main method.

import java.net.URL;
import java.sql.*;
import javax.swing.*;



 public class Connect extends JFrame{

public static String user = null;
public static String password = null;
static Connection conn = null;

public static void loginGUI() throws Exception{
    JPasswordField passwordField = new JPasswordField();
    JTextField userField = new JTextField();
    passwordField.setEchoChar('*');
    Object[] obj = {"Username:\n", userField, "Password:\n", passwordField};
    Object stringArray[] = {"OK", "Cancel"};
    if(JOptionPane.showOptionDialog(null, obj, "Login", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, stringArray, obj)==JOptionPane.YES_OPTION);
    password = new String (passwordField.getPassword());
    user = userField.getText();
    Conn.formConnection();


}



public static void main (String[] args) throws Exception{
            javax.swing.SwingUtilities.invokeLater(new Runnable(){
        public void run(){
            try {
                                    Connect.loginGUI();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
/**
 * Static connection class can only be created once at any given time.
 * @author Nosheen Mahate
 *
 */
public static class Conn{

    public static Connection formConnection() throws Exception{
        try{
            String driver = "net.sourceforge.jtds.jdbc.Driver";
            String url = "jdbc:jtds:sqlserver://BHX4DT-4FPQ35J:1433/Forecast;instance=SQLEXPRESS" +
                    ";user=" +user +";password="+ password +";ssl=request;Encrypt=true;TrustServerCertificate=true";
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);

            try{
                password = null;
                JFrame frame = new JFrame();
                                              frame.add(new SitePanel());
                                              frame.pack();
                                              frame.setVisible(true);
            }
            catch (Exception e){
                System.exit(1);
                JOptionPane.showMessageDialog(null, e, "Error", JOptionPane.ERROR_MESSAGE);


                e.printStackTrace();

            }
        }
        catch (Exception e){
            if(password != null || user !=null){
                JOptionPane.showMessageDialog(null, e, "Error",      JOptionPane.ERROR_MESSAGE);
            }
            else{
            System.exit(1);

            }
            System.out.println("No Connection");
        }

        return conn;

    }
    /**
     * Used to check that the connection is still established
     */
}
public static Connection getConnection(){
    return conn;
}

/**
 * Close the connection to the server
 * @throws SQLException
 */
public static void closeConnection() throws SQLException{
    conn.close();
    conn = null;
}
}

I know there's quite a bit of code there but I wasn't too sure what you might need. Just to rerun I wanted to know how to update the JTable after clicking the JButton, and where the fireTableDataChanged() method should (if needed) be called.

Nosheen
  • 458
  • 1
  • 5
  • 12
  • 1
    *"I know there's quite a bit of code there but I wasn't too sure what you might need."* It is not 'quite a bit' IMO. I expect people would be likely to look at (or at least compile) even more LOC if instead of 2 snippets, you post one [SSCCE](http://sscce.org/). – Andrew Thompson Dec 04 '12 at 09:02
  • @AndrewThompson Think thats clearer, thanks for the tip. – Nosheen Dec 04 '12 at 09:08
  • 1
    Good edit(s), but note an SSCCE needs a `main(String[])` to throw it on-screen, like in this [small example](http://stackoverflow.com/a/8958814/418556). – Andrew Thompson Dec 04 '12 at 09:11
  • Sorry I had forgotten to include it as it was in another class. – Nosheen Dec 04 '12 at 09:21
  • More than one class be be in an SSCCE. E.G. this [SSCCE with 2 classes](http://stackoverflow.com/questions/6965038/getting-fonts-sizes-bold-etc/6965149#6965149). – Andrew Thompson Dec 04 '12 at 09:25

1 Answers1

2
  1. please have look at, starting with

  2. to try to avoiding to update both (a.m.) XxxResultSetTableModel on EventDispatchThread,

  3. start the all JDBC and JTables updates from Workers Thread, from Runnable#Thread, better from SwingWorker, otherwise Swing GUI will be freeze untill JDBC and JTables updates ended

  4. notice, both code are code examples, have to moving all Xxx.close() to the (add create a new) finally block (try - catch - finally)

mKorbel
  • 109,525
  • 20
  • 134
  • 319
  • Thanks, I will need to read up on these links youve posted. Are you pointing out that the reason my table does not get updated is becasue of how the threads are used, or would this just better my code for when it is running? – Nosheen Dec 04 '12 at 09:56
  • As well as what mKorbel posted, I found [this article](http://today.java.net/pub/a/today/2003/10/24/swing.html) pretty helpful too. – Nosheen Dec 06 '12 at 09:08