Я пытаюсь создать JXTreeTable
, первый столбец которого состоит из отображения имени центров затрат (которые являются узлами дерева, которые являются экземплярами DefaultMutableTreeTableNode
), а второй столбец должен отображать значение ( float) стоимости для этого МВЗ. Однако я не могу отобразить данные во втором столбце. Кто-нибудь знает, как я могу исправить мой код, чтобы данные отображались во втором столбце?
Мой код выглядит так:
package com.camposmart.telas;
import com.camposmart.dal.ModuloConexao;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javafx.scene.control.TreeTableColumn;
import javax.swing.JOptionPane;
import javax.swing.JTree;
import javax.swing.table.TableColumn;
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode;
import org.jdesktop.swingx.treetable.DefaultTreeTableModel;
import org.jdesktop.swingx.treetable.TreeTableNode;
/**
*
* @author Arroiz
*/
public class TelaRelatorioFinanceiro2 extends javax.swing.JInternalFrame {
Connection conexao = null;
PreparedStatement pst = null;
ResultSet rs = null;
PreparedStatement pst2 = null;
ResultSet rs2 = null;
/**
* Creates new form TelaRelatorioFinanceiro
*/
public TelaRelatorioFinanceiro2() {
initComponents();
conexao = ModuloConexao.conector();
preencherJTreeTable();
}
public void preencherJTreeTable() { //método responsável por todo o preenchimento da JXTreeTable
try {
TreeTableNode root1 = new DefaultMutableTreeTableNode("Relatório Financeiro");
ArrayList<String> nomeColunas = new ArrayList();
nomeColunas.add("Centro de Custo");
nomeColunas.add("Valor");
DefaultTreeTableModel model = new DefaultTreeTableModel(root1, nomeColunas);
trtbRelatorioFinanceiro.setTreeTableModel(model);
DefaultMutableTreeTableNode root = (DefaultMutableTreeTableNode) model.getRoot();
trtbRelatorioFinanceiro.setShowGrid(true, true);
trtbRelatorioFinanceiro.setColumnControlVisible(true);
trtbRelatorioFinanceiro.packAll();
String sqlContarCentros = "select count(*) from centrocusto"; //contar quantidade de registros na tabela centrocusto.
pst = conexao.prepareStatement(sqlContarCentros);
rs = pst.executeQuery();
rs.next();
int quantidadeCentros = rs.getInt(1);
ArrayList<Integer> idCentrosPreenchidos = new ArrayList(); //criar arraylist para colocar os ids dos centros que ja foram preenchidos na jTree
ArrayList<DefaultMutableTreeTableNode> nomeCentrosPreenchidos = new ArrayList();
Map<String, DefaultMutableTreeTableNode> mapeamentoDeVariaveis = new HashMap<String, DefaultMutableTreeTableNode>();
ArrayList<String> nomeCentrosPreenchidos2 = new ArrayList();
int contadorPreenchimentos = 0; //contador da quantidade de registros que já foram preenchidos na JTree
DefaultMutableTreeTableNode geral = new DefaultMutableTreeTableNode("Geral"); //Preencher o centro de custo Geral na Jtree
root.add(geral);
mapeamentoDeVariaveis.put("Geral", geral);
nomeCentrosPreenchidos.add(geral);
nomeCentrosPreenchidos2.add("Geral");
//marcar no array que o id do centro de custo Geral já foi preenchido na Jtree:
String sqlPegarIdGeral = "select id from centrocusto where pai = ?";
pst = conexao.prepareStatement(sqlPegarIdGeral);
pst.setInt(1, 0);
rs = pst.executeQuery();
rs.next();
int idGeral = rs.getInt(1);
idCentrosPreenchidos.add(idGeral);
//Inicialização de variáveis que compoem o looping:
contadorPreenchimentos++; //Adicionar 1 ao contadorPreenchimentos.
int percorredorDeArray = 0;
boolean idPreenchidoTemFilho = false;
String sqlVerSeTemFilho;
String sqlPegarIdENomeFilhos;
int idFilho;
String nomeFilho;
String sqlPegarNome;
String sqlPegarId;
String nomePai;
ArrayList<DefaultMutableTreeTableNode> nomeFilhoNode = new ArrayList(); //Cria uma lista que guarda vários nós da Jtree
int id;
String sqlSomarValoresCusto;
ArrayList<DefaultMutableTreeTableNode> valorFilhoNode = new ArrayList(); //Cria uma lista que guarda vários nós da Jtree
int contadorFilhoNode = 0;
//Looping de preenchimento:
while (contadorPreenchimentos < quantidadeCentros) { //looping que continua até preencher todos os centros de custo
idPreenchidoTemFilho = false;
while ((percorredorDeArray < contadorPreenchimentos) && (idPreenchidoTemFilho == false)) { //Ver se os centros de custo que já foram preenchidos no array tem filho (desde o primeiro item do array até o último todas as vezes)
sqlVerSeTemFilho = "select tem_filho from centrocusto where id = ?";
pst = conexao.prepareStatement(sqlVerSeTemFilho);
pst.setInt(1, idCentrosPreenchidos.get(percorredorDeArray));
rs = pst.executeQuery();
rs.next();
idPreenchidoTemFilho = rs.getBoolean(1);
if (idPreenchidoTemFilho) {
sqlPegarIdENomeFilhos = "select id, nome from centrocusto where pai = ?";
pst = conexao.prepareStatement(sqlPegarIdENomeFilhos);
pst.setInt(1, idCentrosPreenchidos.get(percorredorDeArray));
rs = pst.executeQuery();
while (rs.next()) {
idFilho = rs.getInt(1); //pega o id do primeiro filho, depois do segundo, etc. se houver
nomeFilho = rs.getString(2); //pega o nome do primeiro filho, depois do segundo, etc. se houver
if (idCentrosPreenchidos.contains(idFilho) == false) { //se no array que grava os ids dos centro preenchidos já estiver cadastrado o id deste filho...
sqlPegarNome = "select nome from centrocusto where id = ?"; //pega o id do pai do filho selecionado para dar o comando pai.add(filho) na jtree
pst2 = conexao.prepareStatement(sqlPegarNome);
pst2.setInt(1, idCentrosPreenchidos.get(percorredorDeArray));
rs2 = pst2.executeQuery();
rs2.next();
nomePai = rs2.getString(1);
nomeFilhoNode.add(new DefaultMutableTreeTableNode(nomeFilho));
mapeamentoDeVariaveis.put(nomeFilho, nomeFilhoNode.get(contadorPreenchimentos - 1));
mapeamentoDeVariaveis.get(nomePai).add(nomeFilhoNode.get(contadorPreenchimentos - 1));
idCentrosPreenchidos.add(idFilho);
nomeCentrosPreenchidos.add(nomeFilhoNode.get(contadorPreenchimentos - 1));
nomeCentrosPreenchidos2.add(nomeFilho);
contadorPreenchimentos++; //adicionar 1 ao contadorPreenchimentos
}
}
}
percorredorDeArray++; //adicionar 1 ao percorredor de array
idPreenchidoTemFilho = false;
}
}
trtbRelatorioFinanceiro.expandAll(); //expandir todos os nós
for (String n : nomeCentrosPreenchidos2) { //for each para percorrer o arraylist para cada elemento existente
sqlPegarId = "SELECT id FROM centrocusto WHERE nome = ?"; //pegar o id a partir do nome contido no arraylist dos nomes dos centros preenchidos
pst = conexao.prepareStatement(sqlPegarId);
pst.setString(1, n);
rs = pst.executeQuery();
rs.next();
id = rs.getInt(1);
sqlSomarValoresCusto = "SELECT SUM(valor_custo) FROM custo WHERE centrocusto = ?"; //somar os registros do campo valor_custo da tabela custo
pst = conexao.prepareStatement(sqlSomarValoresCusto);
pst.setInt(1, id);
rs = pst.executeQuery();
rs.next();
valorFilhoNode.add(new DefaultMutableTreeTableNode(rs.getFloat(1)));
if (trtbRelatorioFinanceiro.getTreeTableModel().getValueAt(mapeamentoDeVariaveis.get(n), 0).toString().equals(n)) {
trtbRelatorioFinanceiro.setEditable(true);
trtbRelatorioFinanceiro.getTreeTableModel().setValueAt(valorFilhoNode.get(contadorFilhoNode), mapeamentoDeVariaveis.get(n), 1);
}
contadorFilhoNode++;
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jspRelatorioFinanceiro = new javax.swing.JScrollPane();
trtbRelatorioFinanceiro = new org.jdesktop.swingx.JXTreeTable();
setClosable(true);
setMaximizable(true);
setTitle("Relatório Financeiro");
trtbRelatorioFinanceiro.setClosedIcon(null);
trtbRelatorioFinanceiro.setOpenIcon(null);
trtbRelatorioFinanceiro.setRootVisible(true);
jspRelatorioFinanceiro.setViewportView(trtbRelatorioFinanceiro);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jspRelatorioFinanceiro, javax.swing.GroupLayout.DEFAULT_SIZE, 663, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jspRelatorioFinanceiro, javax.swing.GroupLayout.DEFAULT_SIZE, 722, Short.MAX_VALUE)
);
setBounds(0, 0, 679, 758);
}// </editor-fold>
// Variables declaration - do not modify
private javax.swing.JScrollPane jspRelatorioFinanceiro;
private org.jdesktop.swingx.JXTreeTable trtbRelatorioFinanceiro;
// End of variables declaration
}
Все запросы возвращают правильное значение из базы данных однако, когда я использую setValueAt (), указывающий на второй столбец, он не заполняется, как показано на изображении ниже:
Я попытался поместить значения во второй столбец как DefaultMutableTreeTableNode
но это не сработало, я пробовал setEditable (true) но тоже не сработало.