Problema para Preencher Jlist quando um item está selecionado

4 respostas
A

Tenho uma tela que contém campos, uma Jlist e uma Jtable e algus botões(inserir,buscar,excluir,editar).Ao clicar no botão buscar, a Jtable é preenchida com dados do banco,ok.Quando clico em uma linha da Jtable a Jlist é preenchida com uma lista de dados referente a cada linha da Jtable,ok.
Então, a cada seleção na Jtable a Jlist é novamente preenchida com os dados referentes à linha selecionada, até aí tudo bem.
O Problema é: Quando seleciono um item na Jlist e tento selecionar uma nova linha na Jtable a Jlist não é atualizada no primeiro clik…gera uma exceção de que os dados de origem da lista não são conhecidos…porém se eu clico novamente na linha da Jtable então a JList é atualizada normalmente.
Eu gostaria de eliminar este erro no primeiro clique.

Algém pode me ajudar!!!

4 Respostas

ferreira2006

coloca o trecho de código que vc usar pra popular o jlist…

A

segue código do método que preenche a Jlist
.
.
.
private void preencheListaItens() {

String sql;
	listaEquip = null;
	listalinhas = null;
	listaItens = null;
	sql = "SELECT codItem,codClasse,descricao FROM itens";// +
	try {
		rs = itemDao.buscaItem(sql);
		listaEquip = new ArrayList<Itens>();
		listalinhas = new ArrayList<Itens>();
		listaItens = new ArrayList<Itens>();
		while (rs.next()) {

			Itens item = new Itens();
			item.setCodigo(rs.getInt("codItem"));
			item.setCodClasse(rs.getInt("codClasse"));
			item.setDescricao(rs.getString("descricao"));

			if (item.getCodClasse() == 2) {
				listaEquip.add(item);
			} else if (item.getCodClasse() == 3) {
				listalinhas.add(item);
			} else if (item.getCodClasse() == 1) {
				listaItens.add(item);
			}
		}

	} catch (NenhumRegistroEncontradoException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (DataAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		// rs.getStatement().close();
		rs.close();

	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	try {
		rs = serieDao
				.buscaSerieEquiptos("SELECT codSerie,codEquipto FROM seriesEquipto"
						+ " WHERE dataFim IS NULL");
	} catch (NenhumRegistroEncontradoException e2) {
		// TODO Auto-generated catch block
		e2.printStackTrace();
	} catch (DataAccessException e2) {
		// TODO Auto-generated catch block
		e2.printStackTrace();
	} catch (SQLException e2) {
		// TODO Auto-generated catch block
		e2.printStackTrace();
	}

	listaSeries = new ArrayList<SerieEquiptos>();

	try {
		while (rs.next()) {
			SerieEquiptos serie = new SerieEquiptos();
			serie.setCodigo(rs.getInt("codSerie"));
			serie.setCodItem(rs.getInt("codEquipto"));
			listaSeries.add(serie);

		}
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	try {
		rs.close();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	if (tcodigo.getText().isEmpty()
			&& tTipo.getText().equalsIgnoreCase("Equipamentos")) {

		for (Itens item : listaEquip) {
			listaEquipto.addItem(item);
		}
	}
	else if (tcodigo.getText().isEmpty()
			&& tTipo.getText().equalsIgnoreCase("Linhas")) {
		for (Itens item : listalinhas) {
			listaEquipto.addItem(item);
		}
	} else if (!tcodigo.getText().isEmpty() && tTipo.getText().isEmpty()) {
		for (Itens item : listaItens) {
			listaEquipto.addItem(item);
		}
	}
}

.
.
.

ferreira2006

Em qual evento da JTable/model você está realizando essa atualização do JList?

Se não for igual ao do código abaixo, tenta dessa maneira.

// Adicinar um SelectionListner em sua tabela
	  tabela.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
			 
			public void valueChanged(ListSelectionEvent e) {			
			        // metodo para atualizar o JList
			}
			
		});
A

Olá, eu tava tentando resolver, mas não consegui ainda.
Segue algumas imagens em anexo para voce ter uma melhor idéia do problema.
Na tela1 um eu cliquo no botão “buscar” e a jtable é criada e é preenchida com os dados de uma tabela.
Na tela2 eu seleciono uma linha da jtable e a JList é preenchida com os dados de uma subtabela relacionada com a tabela1;
Na tela3 eu seleciono outra linha da jtable e então a jList é preenchida com novos itens, até aí tudo bem, posso ficar alternando entre as linhas que a jlist é repreenchida corretamente. O problema começa a partir da próxima tela.
Na tela4 observe que tem um item selecionado na jlist, então quando tento selecionar outra linha na jtable ocorre a exceção da tela 5,e após isto se eu continuo a selecionar outras linhas na jtable então a jlist volta a ser preenchida corretamente outra vez,ou seja o problema só ocorre quando há um item selecionado na jtable.

Será que agora conseguí deixr claro o problema que estou tendo?
segue o método que ppreenche a jlist e o método que trata a seleção da jtable e que chama a o método que praenche a jlist.
Se voce puder me ajudar fico muito grato, pois isto tá me deixando louco.

private void inserirItensDaComposicaoNaLista() {

String sql = "SELECT * FROM detcomposicoes WHERE codCompos="
			+ tcodigo.getText();
	listaItensComposicao=null;
	

	if(listModel!=null){
		
		listModel.clear();
		listaItensDaCompos.setModel(listModel);
		painel.repaint();
		
	}
	try {
		rs = compoDao.buscaComposicao(sql);
		listaItensComposicao = new ArrayList<Itens>();
		ResultSet rsi = null;
		while (rs.next()) {

			rsi = itemDao
					.buscaItem("SELECT codItem,descricao FROM itens WHERE codItem="
							+ rs.getInt("codItem"));
			while (rsi.next()) {
				Itens item = new Itens();
				item.setCodigo(rsi.getInt("codItem"));
				item.setDescricao(rsi.getString("descricao"));
				listaItensComposicao.add(item);
			}
			rsi.close();

		}
		try {
			rs.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	} catch (NenhumRegistroEncontradoException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (DataAccessException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	for (int i = 0; i < listaItensComposicao.size(); i++) {

		listModel.addElement(listaItensComposicao.get(i).getCodigo() + "-"
				+ listaItensComposicao.get(i).getDescricao());
	}
	listaItensDaCompos.setModel(listModel);

}

public void actionPerformed(ActionEvent e) {
.
.
.Tratamento dos eventos disparados pelos demais botões

} else if (e.getActionCommand().equals(“busca”)) {

acaoBuscar();
		painel.add(jscrollItens);
		itens.setVisible(true);
		tableModelCompo = new ResultSetTableModel(rs);
		tableCompo = new JTable(tableModelCompo);
		tableCompo.getTableHeader().getColumnModel().getColumn(0)
				.setMaxWidth(50);
                                            tableCompo.getTableHeader().getColumnModel().getColumn(1)
				.setMaxWidth(120);
		tableCompo.getTableHeader().getColumnModel().getColumn(2)
				.setMaxWidth(50);
                                            tableCompo.getTableHeader().getColumnModel().getColumn(3)
				.setMaxWidth(50);
		tableCompo.getTableHeader().getColumnModel().getColumn(4)
				.setMaxWidth(80);
		tableCompo.getTableHeader().getColumnModel().getColumn(5)
				.setMaxWidth(80);
		tableCompo.getTableHeader().getColumnModel().getColumn(6)
				.setMaxWidth(100);
		tableCompo.getTableHeader().getColumnModel().getColumn(7)
				.setMaxWidth(250);

		tableCompo.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		try {
			rs.close();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		// inicio do tratamento do evento de mouse quando é clicado 
		// em uma linha da Jtable, preenche os campos com o item selecionado
		tableCompo.addMouseListener(new MouseAdapter() {
		tableCompo.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 1) {

					// apaga os valores anteriores dos campos
					tcodigo.setText("");
					tcodEquipto.setText("");
					tcodSerie.setText("");
					tdataini.setText("");
					tdatafim.setText("");
					tresp.setText("");
					tTipo.setText("");
					tObs.setText("");
					// preenche os campos com os novos valores selecionados
					// na Jtable
					tcodigo.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 0)).toString());
					tTipo.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 1)).toString());
					tcodEquipto.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 2)).toString());
					tcodSerie.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 3)).toString());
					tdataini.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 4)).toString());
					tdatafim.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 5)) == null ? ""
							: (tableCompo.getValueAt(tableCompo
									.getSelectedRow(), 5)).toString());
					tresp.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 6)).toString());
					tObs.setText((tableCompo.getValueAt(tableCompo
							.getSelectedRow(), 7)) == null ? ""
							: (tableCompo.getValueAt(tableCompo
									.getSelectedRow(), 7)).toString());
				}
				inserirItensDaComposicaoNaLista();
			}

		});// fim da classe interna MouseAdapter
Criado 28 de março de 2011
Ultima resposta 2 de abr. de 2011
Respostas 4
Participantes 2