Pessoal pra quem costuma usar setLayout(null) aqui vai um tutorial do JTable.
A diferença é que para usar com setLayout(null) tem que usar o setBounds para dimensionar o ScrollPane e a sua posição na tela,
como está no comentário do código abaixo.
Quando usamos FlowLayout não precisa do setBounds.
Coloquei esse tutorial, porque eu sempre tentava fazer o JTable usando setLayout null e ele nunca aparecia na tela, então está aí a solução.
package teste;
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class ExemploJTable {
private JFrame frame;
/** Construtor */
public ExemploJTable() {
initialize();
}
/** Initialize the contents of the frame. */
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(null);
myJTable(); //inicializo jTable
}
public void myJTable(){
String columnNames[] = {"Nome", "Email", "Telefone"};
Object[][] data = {
{"Joao", "joao@gmail.com", "8787544" },
{"Maria", "maria@gmail.com", "454545454"},
{"Jose", "jose@gmail.com", "221212121"},
};
JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(300, 50));
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(76, 86, 303, 68); //para funcinar com setLayout(null) é preciso desse setBounds
frame.getContentPane().add(scrollPane);
}
/** Metodo Main */
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ExemploJTable window = new ExemploJTable();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}