3

This class communicates with my database retrieves data and project them to a JTable.I used the DefaultTableModel but the column names won't appear.I instantiate this class in another class where i retrieve the table with the data through getTable( ).

package jtable;

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

public class ControlDatabase
{  
   private JTable table;
   private Statement stmt;
   private DefaultTableModel model;
   private String all = "SELECT * FROM Players ORDER BY id ASC";


public ControlDatabase( ) 
{
        String dbUsername = "root";
        String dbPassword = "*****";
        String dbHost = "localhost";
        String dbPort = "3306";
        String dbName = "oop_project_database";
        String url = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName; 
    try {
        Connection con = DriverManager.getConnection(url, dbUsername, dbPassword);

        model = new DefaultTableModel();
        model.addColumn("Id");
        model.addColumn("Onoma");
        model.addColumn("Epwnimo");
        model.addColumn("Age");
        model.addColumn("Nickname");
        table = new JTable(model); 

        stmt = con.createStatement();
        updateStatement( all );

    } catch (SQLException ex) {
        ex.printStackTrace(System.out);
    }

}

public void addStatement(String name,String surname,Integer age,String nickname )
{
  String query = "INSERT INTO Players (name,surname,age,nickname) VALUES ('"
                + name +
                "','"
                + surname +
                "',"
                + age +
                ",'"
               + nickname +
               "')";
  try {
        int x = stmt.executeUpdate( query );
        if (x > 0) {
            lastStatement(all);
               // updateStatement(all , true );
        }
      } catch (SQLException e)  {
        e.printStackTrace();
    }
}

public Boolean deleteStatement(String id , int row )
{
  String query = "DELETE FROM Players WHERE id = " + id ;
  try {
        int x = stmt.executeUpdate( query );
        if (x > 0) {
            model.removeRow(row);
            return true;
        }
        return false;

      } catch (SQLException e)  {
        e.printStackTrace();
        return false;
    }
}

public void updateStatement(String query , Boolean flag )
{
    try {
      ResultSet rs = stmt.executeQuery(  query );
        while (rs.next()) {
            int currentId = rs.getInt("id");
            String currentName = rs.getString("name");
            String currentSurname = rs.getString("surname");
            int currentAge = rs.getInt("age");
            String currentNick = rs.getString("nickname");

            Object[] currentRow = { currentId ,currentName, currentSurname, currentAge, currentNick };
            model.addRow(currentRow);
        }
    } catch (SQLException ex) {
        ex.printStackTrace(System.out);
    }
}

public void updateStatement(String query) {
    updateStatement(query , false );
}

public void lastStatement(String query )
{
    try {
      ResultSet rs = stmt.executeQuery(  query );

            rs.last();
            int currentId = rs.getInt("id");
            String currentName = rs.getString("name");
            String currentSurname = rs.getString("surname");
            int currentAge = rs.getInt("age");
            String currentNick = rs.getString("nickname");
            Object[] currentRow = { currentId ,currentName, currentSurname, currentAge, currentNick };
            model.addRow(currentRow);
    } catch (SQLException ex) {
        ex.printStackTrace(System.out);
    }
}

public JTable getTable( ) {
    return table;
}

}  

The main class

package jtable;

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


public class MainD extends JFrame{

   private JPanel p;
   //private JPanel pa;
   private JScrollPane pa; //<-- change
   private JSplitPane splitPane;
   private JButton b,ba;
   private JLabel ln,ls,la,lc;
   private JTextField txs,txn,txa,txc;
   private ControlDatabase data;
   private JTable table;

   public MainD()
   {
     super("Split");
p = new JPanel(new GridLayout(5,2));
//pa = new JPanel(new GridLayout(1,1));
pa = new JScrollPane( ); //<--
ln = new JLabel("Name");
txn = new JTextField();
ls = new JLabel("Surname");
txs = new JTextField();
la = new JLabel("Age");
txa = new JTextField();
ba = new JButton("Add");
lc = new JLabel("Nickname");
txc = new JTextField();
ba.addActionListener(new ActionListener() { //Add
    public void actionPerformed(ActionEvent e){
        String name = txn.getText();
        String surname = txs.getText();
        String sage = txa.getText();

        String nickname = txc.getText();
        if (!( name.isEmpty() || surname.isEmpty() || nickname.isEmpty() || sage.isEmpty() )) {
            try {
                Integer age = Integer.parseInt( sage );
                data.addStatement(name,surname,age,nickname);
                txn.setText("");
                txs.setText("");
                txa.setText("");
                txc.setText("");
            }catch(NumberFormatException ex){
                System.out.println("Age must be an Integer");
            }

        }
        else{
            System.out.println("Empty Fields");
        }
    }
}
);
b = new JButton("Remove");
data = new ControlDatabase();
table = data.getTable();
pa.add(table);
b.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e){
        int row = table.getSelectedRow();
        String value = String.valueOf( table.getValueAt( row ,0 ) );
        data.deleteStatement( value , row );
    }
}
);
p.add(ln);
p.add(txn);
p.add(ls);
p.add(txs);
p.add(la);
p.add(txa);
p.add(lc);
p.add(txc);
p.add(ba);
p.add(b);
splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, p, pa);
splitPane.setDividerLocation(280);
add(splitPane);
setBounds(200,200,800,400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
   }

public static void main(String[] args) {
       new MainD();
}

}
giannis christofakis
  • 8,201
  • 4
  • 54
  • 65
  • Denis Tulskiey is correct since you appear to be adding the JTable directly to a JPanel, not to a JScrollPane. You will want to follow his advice and accept his answer. – Hovercraft Full Of Eels Oct 30 '11 at 12:40
  • Ok i made the change but the table won't appear at all. – giannis christofakis Oct 30 '11 at 12:44
  • That code shouldn't compile since JScrollPane isn't capitalized correctly. Please show only valid code. The next obvious question that I'm sure you've already asked yourself is where do you add the JScrollPane to anything? – Hovercraft Full Of Eels Oct 30 '11 at 12:46
  • I thought here `splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, p, pa);` .The capital C is not on my code it only appears here that way (i made the mistake when i typed the changes) that's why i can compile. – giannis christofakis Oct 30 '11 at 13:01
  • See answer below. You need to add the table to the scrollpane's viewport. Have a look at the [tutorial on how to use scrollpanes](http://download.oracle.com/javase/tutorial/uiswing/components/scrollpane.html) for more detail on why this is important. – Hovercraft Full Of Eels Oct 30 '11 at 13:14

2 Answers2

6

You probably didn't put the table in a JScrollPane, which is why it does not draw the header. Or call getTableHeader() and add it separately. Quoting from JTable javadoc:

Note that if you wish to use a JTable in a standalone view (outside of a JScrollPane) and want the header displayed, you can get it using getTableHeader() and display it separately.

EDIT: To add a component to a JScrollPane either give the component to the constructor of the JScrollPane, or call JScrollPane.setViewportView(component)

Denis Tulskiy
  • 19,012
  • 6
  • 50
  • 68
  • i had certainly forgotten this. Thanks for the refresher. – Aman Oct 30 '11 at 12:51
  • You were write i just add those lines of code. `pa.setLayout(new BorderLayout()); pa.add(table, BorderLayout.CENTER); pa.add(table.getTableHeader(), BorderLayout.NORTH);` and worked. – giannis christofakis Oct 30 '11 at 13:35
  • @giannosfor: is `pa` the scrollpane? Then it is not the correct way to do it. See my edit on the preferred ways to add a table to a scroll pane. – Denis Tulskiy Oct 30 '11 at 13:41
  • I did it that way `pa = new JScrollPane( table );`.I used to do it this way but i wasn't fully understand how JScrollPane works.Both answers helped me a lot. – giannis christofakis Oct 30 '11 at 13:51
  • `@giannosfor:is pa the scrollpane?` Ι just alterate the pa variable and put as comment the `pa = new JPanel( )` or `pa = new JScrollPane( )`. – giannis christofakis Oct 30 '11 at 14:01
5

You need to add a component to a JScrollPane's viewport, not the scrollpane itself.

So change:

pa.add(table);

to:

pa.getViewport().add(table);

And see what happens.

Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373