Amolar de onde? Estamos aqui no GUJ para sanar nossas dúvidas e ajudar a quem também tem, ué. É sempre um prazer colaborar. 
Sim, agora entendi o que se passa.
Faça o seu modelo de dados da seguinte maneira:[code]public class Especificacao {
private long ID;
private String nome;
private List<Requisito> requisitos;
public Especificacao() {
this.requisitos = new ArrayList<Requisito>();
}
public Especificacao(long ID, String nome) {
this();
setID(ID);
setNome(nome);
}
public void addRequisito(Requisito requisito) {
getRequisitos().add(requisito);
}
}
public class Requisito {
private long ID;
private String nome;
public Requisito() { }
public Requisito(String nome) {
setNome(nome);
}
public Requisito(long ID, String nome) {
this(nome);
setID(ID);
}
}[/code]Quando for buscar os dados, crie uma coleção de especificações e preencha tanto os dados básicos quanto os requisitos destas.[code]Requisito requisitoUm = new Requisito(“Requisito um”);
Requisito requisitoDois = new Requisito(“Requisito dois”);
Requisito requisitoTres = new Requisito(“Requisito três”);
List especificacoes = new ArrayList();
Especificacao especificacaoUm = new Especificacao();
especificacaoUm.setID(1);
especificacaoUm.setNome(“Especificação nº 1”);
especificacaoUm.addRequisito(requisitoUm);
especificacaoUm.addRequisito(requisitoDois);
especificacaoUm.addRequisito(requisitoTres);
especificacoes.add(especificacaoUm);
Especificacao especificacaoDois = new Especificacao();
especificacaoDois.setID(2);
especificacaoDois.setNome(“Especificação nº 2”);
especificacaoDois.addRequisito(requisitoUm);
especificacaoDois.addRequisito(requisitoTres);
especificacoes.add(especificacaoDois);[/code]Agora você pode pegar todos os requisitos e adicionar em um HashSet, eliminando as repetições. É como se você fizesse um distinct() em um banco de dados.[code]
Set requisitosSet = new LinkedHashSet();
requisitosSet.add(new Requisito(""));
for (Requisito requisitoEspecificacaoUm : especificacaoUm.getRequisitos()) {
requisitosSet.add(requisitoEspecificacaoUm);
}
for (Requisito requisitoEspecificacaoDois : especificacaoDois.getRequisitos()) {
requisitosSet.add(requisitoEspecificacaoDois);
}[/code]Com isso, temos os requisitos, sem repetição, de nossas especificações. Agora, podemos criar um modelo de tabela assim:[code]
public class EspecificacoesTableModel extends AbstractTableModel {
private List<Especificacao> especificacoes = new ArrayList<Especificacao>();
private List<Requisito> requisitos = new ArrayList<Requisito>();
public List<Especificacao> getEspecificacoes() {
return especificacoes;
}
protected void setEspecificacoes(List<Especificacao> especificacoes) {
this.especificacoes = especificacoes;
}
public List<Requisito> getRequisitos() {
return requisitos;
}
protected void setRequisitos(List<Requisito> requisitos) {
this.requisitos = requisitos;
}
// Recebo, pelo construtor, as especificações e os requisitos que serão as colunas.
public EspecificacoesTableModel(List<Especificacao> especificacoes, List<Requisito> requisitos) {
setEspecificacoes(especificacoes);
setRequisitos(requisitos);
}
public int getRowCount() {
return getEspecificacoes().size();
}
public int getColumnCount() {
return getRequisitos().size();
}
// Eu pego a especificação atual (cada item da coleção é uma linha).
// Se a coluna atual for 0, quer dizer que vou exibir o nome da especificação.
// Se não, eu vou ver qual o requisito atual, ou seja, o requisito que está sendo exibido na coluna.
// Caso esse requisito que está sendo exibido se encontrar na coleção de requisitos da especificação, eu marco com um X.
// Caso contrário, eu não preencho.
public Object getValueAt(int row, int column) {
Especificacao especificacao = getEspecificacoes().get(row);
if (column == 0) {
return especificacao.getNome();
}
else if (column < (getRequisitos().size() + 1)) {
Requisito requisitoAtual = getRequisitos().get(column);
return especificacao.getRequisitos().contains(requisitoAtual) ? "X" : "";
}
}
// Este método é para escrever o nome da coluna. Mesmo esquema de cima: se for a coluna 0, eu escrevo "Especificação".
// Caso contrário, eu coloco qual o nome do requisito.
@Override public String getColumnName(int column) {
if (column == 0) {
return "Especificação";
}
else {
return getRequisitos().get(column).getNome();
}
}
}[/code]Pronto! Agora, simplesmente, é só você chamar a sua tabela na tela. (continuação dos códigos 2 e 3)[code]
EspecificacoesTableModel model = new EspecificacoesTableModel(
especificacoes, new ArrayList(requisitosSet));
JTable tabela = new JTable(model);
JScrollPane scroll = new JScrollPane(tabela);
getContentPane().add(scroll);[/code]
Aqui funcionou perfeitamente. Você pode adicionar mais requisitos, ir trocando os requisitos de cada especificação para você ver o resultado.
É isso que você precisa?