Executando verificação de segurança...
1

Como adicionar cabeçalhos JTable Java/Eclipse

Fala pessoal, já procurei em todos os fóruns e não acho como adicionar os cabeçalhos das colunas na JTable. Já tentei criar a scrollpane e adicionar a table e depois adicionar ao contentpane, mas não resolve. Já mudei outros códigos que sugeriram mas nada funciona.

Segue a classe:

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTable;
import java.awt.ScrollPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.border.TitledBorder;

public class FormRelatorioCursos extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private JTable table;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					FormRelatorioCursos frame = new FormRelatorioCursos();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public FormRelatorioCursos() {
		setTitle("Relat\u00F3rio de Cursos");
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 872, 490);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Relat\u00F3rio de Cursos");
		lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 36));
		lblNewLabel.setBounds(251, 11, 361, 58);
		contentPane.add(lblNewLabel);
		
		table = new JTable();
		table.setToolTipText("");
		table.setModel(new DefaultTableModel(
			new Object[][] {
				{null, null, null, null},
			},
			new String[] {
				"ID", "Dura\u00E7\u00E3o", "Nome do Curso", "N\u00EDvel"
			}
		));
		table.setBounds(10, 82, 836, 358);
		contentPane.add(table);
		
	}
}
Carregando publicação patrocinada...
3

Crie um objeto com a classe DefaultTableModel, o primeiro argumento são os dados e o segundo argumento o nome das colunas, ou seja, o cabeçalho.
Que estranho você usando Swing com o Eclipse, em geral quem usa Eclipse vai de SWT.
Quem usa Swing usa o Netbeans e essa IDE cria tudo de forma visual, não precisa diagramar na raça.

String[][] dados = new String [][]{
              {"SP","Sao Paulo"},
              {"RJ","Rio de Janeiro"},
              {"RN","Rio Grande do Norte"},
              {"PR","Parana"}
};
String[] colunas = new String []{"Estado","Cidade"};
DefaultTableModel modelo = new DefaultTableModel(dados, colunas);
JTable jtable = new JTable( modelo );

Aparentemente o seu código faz isso, porém cria os objetos de forma anônima, ou seja, sem criar uma objeto nomeado.
Única linha que estou desconfiado é essa:
contentPane.setLayout(null);

Tenta algo como
contentPane.setLayout(new BorderLayout(0, 0));

Ou tenta usar outro layout, como FlowLayout, GridLayout, etc.

Esse canal tem uma playlist com uns 155 vídeos sobre Java.
Se quer codificar layout na raça ele ensina:
https://www.youtube.com/@BroCodez/playlists

1

Tentei usar o new BorderLayout, FlowLayout, tentei criar o objeto e depois passar como argumento, conforme tua orientação. Não funcionou. Você pode ver se eu implementei errado? ou se é alguma coisa outra questão...

`
import eclipse.Curso;
import java.util.List;
import dao.CursoDAO;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.Font;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class FormRelatorioCursos extends JFrame {

private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTable tblCursos;

/**
 * Launch the application.
 */
public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		public void run() {
			try {
				FormRelatorioCursos frame = new FormRelatorioCursos();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame.
 */
public FormRelatorioCursos() {
	setTitle("Relat\u00F3rio de Cursos");
	setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	setBounds(100, 100, 872, 490);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));

	setContentPane(contentPane);
	contentPane.setLayout(null);
	
	JLabel lblNewLabel = new JLabel("Relat\u00F3rio de Cursos");
	lblNewLabel.setBounds(248, 10, 355, 44);
	lblNewLabel.setFont(new Font("Tahoma", Font.BOLD, 36));
	contentPane.add(lblNewLabel);
	
	tblCursos = new JTable(criarTabela());
	tblCursos.setBounds(608, 32, 0, 0);
	tblCursos.setToolTipText("");
	contentPane.add(tblCursos);
	
            //ESSE AQUI FOI O CÓDIGO CRIADO AUTOMATICAMENTE AO SELECIONAR NO DESIGN
	/*tblCursos.setModel(new DefaultTableModel(
		new Object[][] {
			{null, null, null, null},
		},
		new String[] {
			"ID", "Dura\u00E7\u00E3o", "Nome do Curso", "N\u00EDvel"
		}
	));
	tblCursos.setBounds(10, 82, 836, 358);
	contentPane.add(tblCursos);*/ ACABA AQUI, COMENTEI PRA TENTAR SUA SOLUÇÃO
	
	preencheTabela();
	
}

public DefaultTableModel criarTabela() {
	
	String[][] dados = new String[][] {
		
		{"1", "2", "3", "4"}
		
	};
	
	String[] colunas = new String[] {
		
		"ID", "Duração", "Nome do Curso", "Nível"
		
	};
	
	DefaultTableModel tblCursos = new DefaultTableModel(dados, colunas);
	
	return tblCursos;
	
}

private void preencheTabela() {
	
	CursoDAO cursoDAO = new CursoDAO();
	List<Curso> listaCursos = cursoDAO.getCursos();
	
	DefaultTableModel tabelaCursos = (DefaultTableModel) tblCursos.getModel();
	
	for(Curso c : listaCursos) {
		
		Object[] obj = new Object[] {
				c.getId(),
				c.getNomecurso(),
				c.getNivel(),
				c.getDuracao()
		};
		
		tabelaCursos.addRow(obj);
		
	}
	
}

}

`

Tentei também colocar no construtor da classe, assim funcionou igual como estava antes, sendo cabeçalho:

String[][] dados = new String[][] { }; String[] colunas = new String[] { "ID", "Duração", "Nome do Curso", "Nível" }; DefaultTableModel dtm = new DefaultTableModel(dados, colunas); tblCursos = new JTable(dtm); tblCursos.setBounds(10, 85, 836, 355); tblCursos.setToolTipText(""); contentPane.add(tblCursos);

Na verdade estou aprendendo essa parte da interface gráfica numa série de aulas no youtube, eu estudo por conta própria, então existe algumas coisas que eu acabo não descobrindo, por exemplo, que quem usa normalmente Swing é com NetBeans. Inclusive a aula é no netbeans, mas eu gosto do Eclipse e normalmente tento fazer as coisas diferente ou acrescentando algum nível de dificuldade (dentro dos meus limites, claro) pra ir aprendendo a resolver os problemas que aparecem. Como eu não faço faculdade, acredito que é a melhor forma de ir descobrindo essas coisas. Ahh, e nem sei o que é SWT, mas já vou atrás de pesquisar!