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.