Fixar tamanho JFrame

Pessoal, eu tenho uma classe que extende JFrame e nela eu tenho um painel sendo que eu adiciono váriás tabelas e labels neste painel. Preciso que o JFrame fique com uma certa largura de modo que as colunas da minha tabela não fiquei escondidas, ou seja, de modo que a tabela não precise usar o scrollpane; Eu tentei usar o setSize no JFrame mas não consegui. A parte de qual layout está usando eu peguei da net, pois não conheço a fundo swing e possa ser que tenha algo errado com ele.

Abaixo está minha classe JFrame e tb minha tableModel. Se alguém puder me ajudar eu agradeço.

É só executar e ver como abre a janela de forma que as tabelas ficam com as colunas escondidas e quando aumenta a largura da janela as colunas vão aparecendo até ficarem todas expostas.

package com.sismat.telas;

import com.sismat.classes.visualizacao.AlunoBoletimVisualizacao;
import com.sismat.classes.visualizacao.DisciplinaBoletimVisualizacao;
import com.sismat.table.BoletimTabelModel;
import com.sismat.table.QuadroGeralTableModel;
import java.awt.Dimension;
import java.util.List;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;

public class TelaBoletim extends javax.swing.JFrame {

    public TelaBoletim() {        
        JLabel nome = null;
        JLabel turma = null;
        JPanel panel = new JPanel();
        JTable table = null;
        JScrollPane jstable = null;
        JScrollPane jspane = null;
        BoletimTabelModel modelBoletim = null;        
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBorder(new EmptyBorder(40, 60, 40, 60));
        for (int i = 0; i < 4; i++) {
            nome = new JLabel("Aluno: ");
            turma = new JLabel("Turma: ");
            panel.add(new JLabel("Escola Municipal Amadeu Bolognesi"));
            panel.add(nome);
            panel.add(turma);
            modelBoletim = new BoletimTabelModel();
            table = new JTable();            
            table.setModel(modelBoletim);
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            table.getColumnModel().getColumn(0).setPreferredWidth(150);
            table.getColumnModel().getColumn(1).setPreferredWidth(57);
            table.getColumnModel().getColumn(2).setPreferredWidth(90);
            table.getColumnModel().getColumn(3).setPreferredWidth(57);
            table.getColumnModel().getColumn(4).setPreferredWidth(57);
            table.getColumnModel().getColumn(5).setPreferredWidth(90);
            table.getColumnModel().getColumn(6).setPreferredWidth(57);
            table.getColumnModel().getColumn(7).setPreferredWidth(57);
            table.getColumnModel().getColumn(8).setPreferredWidth(90);
            table.getColumnModel().getColumn(9).setPreferredWidth(57);
            table.getColumnModel().getColumn(10).setPreferredWidth(75);
            table.getColumnModel().getColumn(11).setPreferredWidth(90);
            jstable = new JScrollPane();
            jstable.setViewportView(table);            
            panel.add(jstable);
            panel.add(Box.createRigidArea(new Dimension(0, 100)));
        }
        jspane = new JScrollPane();
        jspane.setViewportView(panel);
        this.add(jspane);        
        this.setSize(2500, 2000);              
        initComponents();       
    }
	
	@SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Boletins");
        setMinimumSize(new java.awt.Dimension(700, 300));
        getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.LINE_AXIS));

        pack();
    }// </editor-fold>

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TelaBoletim().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    // End of variables declaration

}

E a tableModel

package com.sismat.table;

import com.sismat.classes.visualizacao.DisciplinaBoletimVisualizacao;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class BoletimTabelModel extends AbstractTableModel{
    private static final int COL_NOME = 0;
    private static final int COL_MEDIA1 = 1;
    private static final int COL_RECUPERACAO1 = 2;
    private static final int COL_FALTA1 = 3;
    private static final int COL_MEDIA2 = 4;
    private static final int COL_RECUPERACAO2 = 5;
    private static final int COL_FALTA2 = 6;
    private static final int COL_MEDIA3 = 7;
    private static final int COL_RECUPERACAO3 = 8;
    private static final int COL_FALTA3 = 9;
    private static final int COL_MEDIAFINAL = 10;
    private static final int COL_TOTALFALTAS = 11;

    private List<DisciplinaBoletimVisualizacao> disciplinas;

    //Construtor default que apenas cria uma lista vazia de DisciplinaBoletimVisualizacao
    public BoletimTabelModel() {
        this(new ArrayList<DisciplinaBoletimVisualizacao>());
    }

    //Esse é um construtor, que recebe a nossa lista de aulas
    public BoletimTabelModel(List<DisciplinaBoletimVisualizacao> disciplinas) {
        this.disciplinas = new ArrayList<DisciplinaBoletimVisualizacao>(disciplinas);
    }

    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.
        return disciplinas.size();
    }

    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 2.
        return 12;
    }
  
    @Override
    public String getColumnName(int column) {
        //Qual é o nome das nossas colunas?
        if (column == COL_NOME)
            return "Disciplina";
        else if(column == COL_MEDIA1)
            return "Média1";
        else if(column == COL_RECUPERACAO1)
            return "Recuperação1";
        else if(column == COL_FALTA1)
            return "Falta1";
        else if(column == COL_MEDIA2)
            return "Média2";
        else if(column == COL_RECUPERACAO2)
            return "Recuperação2";
        else if(column == COL_FALTA2)
            return "Falta2";
        else if(column == COL_MEDIA3)
            return "Média3";
        else if(column == COL_RECUPERACAO3)
            return "Recuperação3";
        else if(column == COL_FALTA3)
            return "Falta3";
        else if(column == COL_MEDIAFINAL)
            return "Média Final";
        else if(column == COL_TOTALFALTAS)
            return "Total Faltas";
        return ""; //Nunca deve ocorrer
    }

    public Object getValueAt(int row, int column) {
        //Pega a aula da linha row.
        DisciplinaBoletimVisualizacao disciplina = disciplinas.get(row);

        //Verifica qual valor deve ser retornado
        if (column == COL_NOME)
            return disciplina.getNome();
        else if(column == COL_MEDIA1)
            return disciplina.getMedia1();
        else if(column == COL_RECUPERACAO1)
            return disciplina.getRecuperacao1();
        else if(column == COL_FALTA1)
            return disciplina.getFaltas1();
        else if(column == COL_MEDIA2)
            return disciplina.getMedia2();
        else if(column == COL_RECUPERACAO2)
            return disciplina.getRecuperacao2();
        else if(column == COL_FALTA2)
            return disciplina.getFaltas2();
        else if(column == COL_MEDIA3)
            return disciplina.getMedia3();
        else if(column == COL_RECUPERACAO3)
            return disciplina.getRecuperacao3();
        else if(column == COL_FALTA3)
            return disciplina.getFaltas3();
        else if(column == COL_MEDIAFINAL)
            return disciplina.getMediafinal();
        else if(column == COL_TOTALFALTAS)
            return disciplina.getTotalfaltas();
        return ""; //Nunca deve ocorrer
    }

    @Override
    public void setValueAt(Object aValue, int row, int column) {
        //Pega a aula da linha row.
        DisciplinaBoletimVisualizacao disciplina = disciplinas.get(row);

        //Verifica qual valor vai ser alterado
        if (column == COL_NOME)
            disciplina.setNome(aValue.toString());
        else if(column == COL_MEDIA1)
            disciplina.setMedia1(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_RECUPERACAO1)
            disciplina.setRecuperacao1(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_FALTA1)
            disciplina.setFaltas1(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_MEDIA2)
            disciplina.setMedia2(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_RECUPERACAO2)
            disciplina.setRecuperacao2(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_FALTA2)
            disciplina.setFaltas2(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_MEDIA3)
            disciplina.setMedia3(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_RECUPERACAO3)
            disciplina.setRecuperacao3(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_FALTA3)
            disciplina.setFaltas3(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_MEDIAFINAL)
            disciplina.setMediafinal(Integer.parseInt((String)(aValue.toString())));
        else if(column == COL_TOTALFALTAS)
            disciplina.setTotalfaltas(Integer.parseInt((String)(aValue.toString())));
    }

    @Override
    public boolean isCellEditable(int row, int column) {
        //Indicamos se a célula da row e da column é editável.Nossa tabela toda é.
        return false;
    }

    public DisciplinaBoletimVisualizacao getObject(int row) {
        //Já que esse tableModel é de Disciplina, vamos fazer um get que retorne uma Disciplina inteira.
        //Isso elimina a necessidade de chamar o getValueAt() nas telas.
        return disciplinas.get(row);
    }
}

Agradeço e fico no aguardo de uma ajudinha.

Abraços.

O setSize não está fazendo efeito porque depois que ele é chamado, o método initComponents chama o pack(), que deve estar diminuindo o tamanho da tela.

Você pode usar o método da JTable para setar o tamanho ideal do scroll.

Muito obrigado, funcionou perfeitamente dimensionando o tamanho do scroll da tabela.

Entendi tb que o pack() era chamado pelo initComponents() e isto “limpava” os setSize();

Teria alguma maneira simples de alinhar os Label para a esquerda, ou seja, pra ficarem alinhados com a tabela?

Grande abraço e valeu pela ajuda.

Acho que com o que a API disponibiliza, não tenha forma “mais fácil” de colocar componentes um abaixo do outro.

Mas para montar layout a mão, o MigLayout é uma excelente opção.