[Resolvido]Arraylist duplicado

3 respostas
geraldofrancisco

bom dia pessoal estou com a seguinte dúvida: criei uma tela que recebe dois arraylists iguais do tipo (Livro que foi o objeto que eu criei) para alterar um conforme o usuário interage e outra para comparação. só tem um problema, quando eu altero o valor de um arraylist o outro também ta sendo alterado. segue abaixo o objeto criado e logo em seguida o código:

Objeto

public class Livro {
	int idLivro, quantidade, volume, idPreco;
	float valor;
	String idioma, item, nome;
	
	public Livro(int idLivro, int quantidade, int volume, float valor, int idPreco, String idioma, String item, String nome){
		this.idLivro = idLivro;
		this.quantidade = quantidade;
		this.volume = volume;
		this.valor = valor;
		this.idioma = idioma;
		this.item = item;
		this.nome = nome;
		this.idPreco = idPreco;
	}

	public int getID() {		
		return idLivro;
	}
	
	public int getIdPreco() {		
		return idPreco;
	}
	
	public int getVolume(){
		return volume;
	}
	
	public int getQuantidade(){
		return quantidade;
	}
	
	public String getItem(){
		return item;
	}
	
	public String getIdioma(){
		return idioma;
	}
	
	public String getNome(){
		return nome;
	}
	public Float getValor(){
		return valor;
	}
	
	public void setQuantidade(int valorAlterado){
		quantidade = valorAlterado;
	}
	
}

e a tela com as comparações:

package Movimentacao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.EtchedBorder;

import BancoDeDados.Conexao;
import javax.swing.JLabel;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JComboBox;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JRadioButton;

import org.apache.commons.lang3.StringUtils;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class AlteracaoPedido extends Conexao {
	
	ResultSet rs;
	String sql, idiomaSolicitado, itemSolicitado;
	int estoque, idTabelaPreco, idTabelaLivro, quantidadeSolicitada, volumeSolicitado;
	float valorLivro;
	public boolean teveAlteracao = false;
	public static JPanel janela;
	JLayeredPane painelCentral;
	private JTextField volume;
	private JTextField quantidade;
	private JTable table;
	private JTextField idPedido;
	private JTextField qtdAlterar;
	public JComboBox orcamento = new JComboBox();
	final JLabel lblQuantidadeMximaPermitida = new JLabel();
	public ArrayList<Livro> pedidoOld = new ArrayList<Livro>();
	public ArrayList<Livro> pedidoNew = new ArrayList<Livro>();
	String pedidoEscolhido;
	
	public AlteracaoPedido(){
		super();
		Inicio();
	}
	
	public void limpaArray(){
		pedidoOld.clear();
		pedidoNew.clear();
	}
	
	public void cancela(){
		int idNew = 0, idOld = 0, qtdNew = 0, qtdOld = 0, diferenca, estoque = 0, cont;
		int regNew = pedidoNew.size(), regOld = pedidoOld.size();	
		String item;
		boolean existe;
		if(teveAlteracao == true){
			if(JOptionPane.showConfirmDialog(null, "Tem certeza que deseja cancelar?", "Questão", JOptionPane.YES_NO_OPTION) == 0){
				//metodos de cancelamento da alteração
				
				//verificando se houve alteração nos ítens originais do pedido
				for(Livro p1 : pedidoOld){
					cont = 0;
					existe = false;							
					for(Livro p2 : pedidoNew){																	
						diferenca = 0;
						estoque = 0;
						item = p1.getItem();
						idNew = p2.getID();
						idOld = p1.getID();
						qtdNew = p2.getQuantidade();
						qtdOld = p1.getQuantidade();						
						
						if(!(item == "B" || item == "D" || item == "F")){
							if(idOld == idNew){		
								JOptionPane.showMessageDialog(null, "qtdNew = "+qtdNew+" - qtdOld = "+qtdOld);
								existe = true;
								sql = "SELECT quantidade FROM livros WHERE idlivro = "+idOld;
								rs = ConsultaBanco(sql);
								try {
									while(rs.next()){
										estoque = rs.getInt(1);
									}
								} catch (SQLException e) {
									e.printStackTrace();
								}
								
								if(qtdNew > qtdOld){
									diferenca = qtdNew - qtdOld;
									estoque += diferenca;
									JOptionPane.showMessageDialog(null, estoque);
									sql = "UPDATE livros SET quantidade = "+estoque+" WHERE idlivro = "+idNew;
									GravaBanco(sql);
								}else if(qtdNew < qtdOld){
									diferenca = qtdOld - qtdNew;
									estoque -= diferenca;
									JOptionPane.showMessageDialog(null, estoque);
									sql = "UPDATE livros SET quantidade = "+estoque+" WHERE idlivro = "+idNew;
									GravaBanco(sql);
								}																		
							}
						}
						
						cont++;
						//se existir anteriormente e foi excluído do novo array o estoque tem de ser baixado novamente
						if(((cont == regNew) && (existe == false))&& !(item == "B" || item == "D" || item == "F" )){									
							estoque = 0;
							sql = "SELECT quantidade FROM livros WHERE idlivro = "+idOld;
							rs = ConsultaBanco(sql);
							try {
								while(rs.next()){
									estoque = rs.getInt(1);
								}
							} catch (SQLException e) {										
								e.printStackTrace();
							}
							estoque -= qtdOld; 
							JOptionPane.showMessageDialog(null, "id "+idOld+" estoque no banco "+estoque);
							sql = "UPDATE livros SET quantidade = "+estoque+" WHERE idlivro = "+idOld;
							GravaBanco(sql);
						}								
					}							
				}
			}
			
			limpaArray();
			alteraTableVisual();
			orcamento.setEnabled(true);
		}else{
			JOptionPane.showMessageDialog(null, "Não houve nenhuma alteração");
		}
	}
	
	private void alteraTableVisual(){
		int cont = 0;
		String volume, item, idioma, quantidade, nome;
		String [][] linhas = new String[pedidoNew.size()][3];
		for (Livro p : pedidoNew) {  
			volume = String.valueOf(p.getVolume());
			item = p.getItem();
			idioma = p.getIdioma();
			quantidade =  StringUtils.leftPad(String.valueOf(p.getQuantidade()),2,"0");
			nome = p.getNome();
			linhas[cont][0] = StringUtils.leftPad(String.valueOf(cont+1),3,"0");			
			linhas[cont][2] =quantidade;
			
			switch(item){
			case "Prospécto":
			case "Amarelo":				
				linhas[cont][1] = item+" - "+nome+" - "+idioma;
				break;
			case "Cavaleiro":
				linhas[cont][1] = item+" - "+idioma;
				break;
			case "B":
			case "D":
			case "F":
				linhas[cont][1] = item;
				break;
			default:
				linhas[cont][1] = StringUtils.leftPad(volume,3,"0") + "º Vol - "+item+" - "+idioma;
				break;
			}
			
			cont++;
		}  
		table.setModel(new DefaultTableModel(linhas, new String[] {"ID", "ÍTEM", "QUANTIDADE"}));
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		table.getColumnModel().getColumn(0).setPreferredWidth(50);  
		table.getColumnModel().getColumn(1).setPreferredWidth(492);  
		table.getColumnModel().getColumn(2).setPreferredWidth(120);
	}
		
	public void Inicio(){
		try{
			for(LookAndFeelInfo z:UIManager.getInstalledLookAndFeels()){
				if("Nimbus".equals(z.getName())){
					UIManager.setLookAndFeel(z.getClassName());
					break;
				}
			}
		}catch(Exception e){
			JOptionPane.showMessageDialog(null,e);
		}
		janela = new JPanel();
		janela.setBounds(0, 0, 1400, 600);		
		janela.setLayout(null);
		painelCentral = new JLayeredPane();
		painelCentral.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));		
		painelCentral.setBounds(27,75,1282,405);
		painelCentral.setLayout(null);
		janela.add(painelCentral);	
		
		JLabel lblEscolhaOOramento = new JLabel("Escolha o or\u00E7amento:");
		lblEscolhaOOramento.setFont(new Font("SansSerif", Font.BOLD, 23));
		lblEscolhaOOramento.setBounds(314, 11, 257, 30);
		painelCentral.add(lblEscolhaOOramento);		
		
		orcamento.setFont(new Font("SansSerif", Font.PLAIN, 20));
		orcamento.setBounds(583, 15, 403, 30);
		painelCentral.add(orcamento);
		orcamento.addItem("Selecione");
		sql = "SELECT ped.id_pedido, cli.nome_cli FROM pedido ped INNER JOIN clientes cli ON ped.id_cliente = cli.idcliente" +
				" WHERE ped.inativo = 0 ORDER BY ped.id_pedido DESC";
		rs = ConsultaBanco(sql);
		try {
			while(rs.next()){
				orcamento.addItem(StringUtils.leftPad(rs.getString(1), 5, "0")+" - "+rs.getString(2));
			}
		} catch (SQLException e) {			
			e.printStackTrace();
		}
		
		
		JLayeredPane layeredPane = new JLayeredPane();
		layeredPane.setBorder(new TitledBorder(null, "OP\u00C7\u00D5ES DE OR\u00C7AMENTO", TitledBorder.CENTER, TitledBorder.ABOVE_TOP, null, null));
		layeredPane.setBounds(12, 53, 531, 327);
		painelCentral.add(layeredPane);
		
		lblQuantidadeMximaPermitida.setFont(new Font("SansSerif", Font.BOLD | Font.ITALIC, 14));
		lblQuantidadeMximaPermitida.setForeground(Color.RED);
		lblQuantidadeMximaPermitida.setBounds(124, 233, 289, 19);
		lblQuantidadeMximaPermitida.setVisible(false);
		layeredPane.add(lblQuantidadeMximaPermitida);
		
		JLabel lblIdioma = new JLabel("Idioma: ");
		lblIdioma.setFont(new Font("SansSerif", Font.BOLD, 23));
		lblIdioma.setBounds(70, 34, 96, 30);
		layeredPane.add(lblIdioma);
		
		final JComboBox idioma = new JComboBox();
		idioma.setFont(new Font("SansSerif", Font.PLAIN, 20));
		idioma.setBounds(178, 35, 175, 30);
		layeredPane.add(idioma);
		idioma.addItem("Português");
		idioma.addItem("Inglês");
		idioma.addItem("Espanhol");
		idioma.addItem("Françês");
		idioma.addItem("Italiano");
		idioma.addItem("Alemão");
		idioma.addItem("Árabe");
		
		JLabel label = new JLabel("\u00CDtem:");
		label.setFont(new Font("SansSerif", Font.BOLD, 23));
		label.setBounds(16, 112, 64, 30);
		layeredPane.add(label);
		
		final JComboBox item = new JComboBox();
		
		
		item.setFont(new Font("SansSerif", Font.PLAIN, 20));
		item.setBounds(81, 113, 144, 30);
		layeredPane.add(item);
		item.addItem("Selecione");
		item.addItem("Amarelo");
		item.addItem("Obra");
		item.addItem("Réplica");
		item.addItem("Tréplica");
		item.addItem("Histórico");
		item.addItem("Cavaleiro");
		item.addItem("Prospécto");
		item.addItem("B");
		item.addItem("D");
		item.addItem("F");
		
		JLabel label_1 = new JLabel("Volume:");
		label_1.setFont(new Font("SansSerif", Font.BOLD, 23));
		label_1.setBounds(282, 112, 93, 30);
		layeredPane.add(label_1);
		
		volume = new JTextField();
		volume.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent arg0) {
				char ch = arg0.getKeyChar();
				try{  
                	Integer.parseInt(ch+"");  
                }catch (NumberFormatException ex){  
            	  	arg0.consume();  
                } 
			}
		});
		volume.setFont(new Font("SansSerif", Font.PLAIN, 20));
		volume.setEnabled(false);
		volume.setColumns(10);
		volume.setBounds(387, 114, 122, 28);
		layeredPane.add(volume);
		
		JLabel label_2 = new JLabel("Compl:");
		label_2.setFont(new Font("SansSerif", Font.BOLD, 23));
		label_2.setBounds(16, 194, 95, 26);
		layeredPane.add(label_2);
		
		final JComboBox complemento = new JComboBox();
		complemento.setFont(new Font("SansSerif", Font.PLAIN, 20));
		complemento.setEnabled(false);
		complemento.setBounds(102, 193, 185, 30);
		layeredPane.add(complemento);
		
		JLabel label_3 = new JLabel("Quant:");
		label_3.setFont(new Font("SansSerif", Font.BOLD, 23));
		label_3.setBounds(298, 187, 86, 41);
		layeredPane.add(label_3);
		
		quantidade = new JTextField();
		quantidade.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent arg0) {
				char ch = arg0.getKeyChar();
				try{  
                	Integer.parseInt(ch+"");  
                }catch (NumberFormatException ex){  
            	  	arg0.consume();  
                } 
			}
		});
		quantidade.setFont(new Font("SansSerif", Font.PLAIN, 20));
		quantidade.setColumns(10);
		quantidade.setBounds(387, 194, 122, 28);
		layeredPane.add(quantidade);
		
		JButton btnInserir = new JButton("Adicionar");				
		btnInserir.setFont(new Font("SansSerif", Font.BOLD, 25));
		btnInserir.setBounds(184, 264, 152, 45);
		layeredPane.add(btnInserir);
		
		JLayeredPane layeredPane_1 = new JLayeredPane();
		layeredPane_1.setBorder(new TitledBorder(null, "\u00CDTENS DO OR\u00C7AMENTO", TitledBorder.CENTER, TitledBorder.ABOVE_TOP, null, null));
		layeredPane_1.setBounds(576, 53, 695, 184);
		painelCentral.add(layeredPane_1);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(6, 20, 683, 158);
		layeredPane_1.add(scrollPane);
		
		table = new JTable();
		table.setFillsViewportHeight(true);
		table.setFont(new Font("SansSerif", Font.BOLD, 16));
		table.setModel(new DefaultTableModel(
			new Object[][] {
			},
			new String[] {
				"ID", "\u00CDTEM", "QUANTIDADE"
			}
		));
		
		 
		table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
		table.getColumnModel().getColumn(0).setPreferredWidth(50);  
		table.getColumnModel().getColumn(1).setPreferredWidth(492);  
		table.getColumnModel().getColumn(2).setPreferredWidth(120);  
		scrollPane.setViewportView(table);
		
		JLayeredPane layeredPane_2 = new JLayeredPane();
		layeredPane_2.setBorder(new TitledBorder(null, "Altera\u00E7\u00F5es no pedido", TitledBorder.LEADING, TitledBorder.ABOVE_TOP, null, null));
		layeredPane_2.setBounds(576, 246, 695, 134);
		painelCentral.add(layeredPane_2);
		
		JButton processa = new JButton("Processa");
		
		processa.setFont(new Font("SansSerif", Font.BOLD, 25));
		processa.setBounds(446, 50, 185, 45);
		layeredPane_2.add(processa);
		
		idPedido = new JTextField();
		idPedido.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				char ch = e.getKeyChar();
				try{  
                	Integer.parseInt(ch+"");  
                }catch (NumberFormatException ex){  
            	  	e.consume();  
                } 
			}
		});
		idPedido.setFont(new Font("SansSerif", Font.PLAIN, 20));
		idPedido.setColumns(10);
		idPedido.setBounds(292, 60, 122, 28);
		layeredPane_2.add(idPedido);
		
		JLabel label_4 = new JLabel("Escolha o ID:");
		label_4.setFont(new Font("SansSerif", Font.BOLD, 23));
		label_4.setBounds(126, 56, 161, 35);
		layeredPane_2.add(label_4);
		
		qtdAlterar = new JTextField();
		qtdAlterar.addKeyListener(new KeyAdapter() {
			@Override
			public void keyTyped(KeyEvent e) {
				char ch = e.getKeyChar();
				try{  
                	Integer.parseInt(ch+"");  
                }catch (NumberFormatException ex){  
            	  	e.consume();  
                } 
			}
		});
		qtdAlterar.setFont(new Font("SansSerif", Font.PLAIN, 20));
		qtdAlterar.setColumns(10);
		qtdAlterar.setBounds(292, 88, 122, 28);
		layeredPane_2.add(qtdAlterar);
		
		JLabel label_5 = new JLabel("Escolha a quantidade:");
		label_5.setFont(new Font("SansSerif", Font.BOLD, 23));
		label_5.setBounds(26, 87, 263, 28);
		layeredPane_2.add(label_5);
		
		final JRadioButton alterarQuantidade = new JRadioButton("Alterar quantidade");		
		alterarQuantidade.setSelected(true);
		alterarQuantidade.setFont(new Font("SansSerif", Font.BOLD | Font.ITALIC, 14));
		alterarQuantidade.setBounds(75, 26, 161, 18);
		layeredPane_2.add(alterarQuantidade);
		
		final JRadioButton excluirItem = new JRadioButton("Excluir \u00EDtem do pedido");
		
		excluirItem.setFont(new Font("SansSerif", Font.BOLD | Font.ITALIC, 14));
		excluirItem.setBounds(360, 27, 185, 18);
		layeredPane_2.add(excluirItem);		
		
		
		JLabel lblNewLabel = new JLabel("ALTERA\u00C7\u00C3O DE OR\u00C7AMENTOS");
		lblNewLabel.setFont(new Font("SansSerif", Font.BOLD, 32));
		lblNewLabel.setBounds(458, 11, 549, 53);
		janela.add(lblNewLabel);
		
		JButton finalizar = new JButton("FINALIZAR");
		finalizar.setFont(new Font("SansSerif", Font.BOLD, 30));
		finalizar.setBounds(399, 492, 184, 57);
		janela.add(finalizar);
		
		JButton cancelar = new JButton("CANCELAR");		
		cancelar.setFont(new Font("SansSerif", Font.BOLD, 30));
		cancelar.setBounds(608, 492, 209, 57);
		janela.add(cancelar);
		
		orcamento.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				limpaArray();
				String escolha = String.valueOf(orcamento.getSelectedItem());
				if(escolha != "Selecione"){
					//JOptionPane.showMessageDialog(null, escolha);					
					pedidoEscolhido = escolha.substring(0, 5);
					sql = "SELECT liv.tipo, liv.idlivro, liv.volume, liv.lingua, mo.valor_mo, mo.quant, mo.id_preco, liv.nome," +
					" liv.num_tipo FROM movim mo INNER JOIN livros liv ON mo.id_livro = liv.idlivro " +
					"WHERE mo.id_pedido ="+pedidoEscolhido+" ORDER BY liv.lingua, liv.num_tipo, liv.volume";
					rs = ConsultaBanco(sql);
					int idLivro = 0, quantidade, volume, idPreco, numTipo;
					float valor;
					String idioma, item = null, nome = null;
					Livro livro = null;
					try {
						while(rs.next()){
							idLivro = rs.getInt(2);
							quantidade = rs.getInt(5);
							volume = rs.getInt(3);
							idPreco = rs.getInt(7);
							valor = rs.getFloat(5);
							idioma = rs.getString(4);
							item = rs.getString(1);
							nome = rs.getString(8);
							numTipo = rs.getInt(9);
							if(numTipo <= 4){
								//Obra, Réplica, Tréplica, Histórico
								livro = new Livro(idLivro, quantidade, volume, valor, 0/*idPreço*/, idioma, item, ""/*nome*/);
							}else if(numTipo == 6){
								//Cavaleiro
							}else if(numTipo == 5 || numTipo == 7){
								//Amarelo, Prospécto
								livro = new Livro(idLivro, quantidade, volume, valor, 0, idioma, item, nome);
							}
							
							pedidoNew.add(livro);							
						}
					} catch (SQLException e) {						
						e.printStackTrace();
					}
					sql = "SELECT valor_mo, quant, id_preco FROM movim WHERE id_preco > 8 AND id_pedido = "+pedidoEscolhido;
					rs = ConsultaBanco(sql);
					try {
						while(rs.next()){
							idPreco = rs.getInt(3);
							quantidade = rs.getInt(2);
							volume = 0;
							valor = rs.getFloat(1);
							idioma = "";
							switch(idPreco){
							case 9:
								idLivro = 99999;
								nome = "B";
								item = "B";
								break;
							case 10:
								idLivro = 99998;
								nome = "D";
								item = "D";
								break;
							case 11:
								idLivro = 99997;
								nome = "F";
								item = "F";
								break;
							}
							livro = new Livro(idLivro, quantidade, volume, valor, idPreco, idioma, item, nome);
							pedidoNew.add(livro);							
						}
					} catch (SQLException e) {
						e.printStackTrace();
					}
					pedidoOld.addAll(pedidoNew);
					orcamento.setEnabled(false);
					alteraTableVisual();
				}
			}
		});
		
		cancelar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				cancela();					
			}
		});
		
		btnInserir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				String orcamentoSelecionado = String.valueOf(orcamento.getSelectedItem());
				if(orcamentoSelecionado == "Selecione"){
					JOptionPane.showMessageDialog(null, "Escolha um pedido antes de continuar");
					orcamento.requestFocus();					
				}else{
					//inserir o resto do codigo de inserção do ítem
					String escolha = String.valueOf(item.getSelectedItem());
					String completa = String.valueOf(complemento.getSelectedItem());
					int aprovado = 1;
					int vol, qtd;				
					lblQuantidadeMximaPermitida.setVisible(false);
					switch (escolha){
					case "Selecione":
						JOptionPane.showMessageDialog(null, "Escolha um ítem antes de continuar!");
						aprovado = 0;
						break;
					case "Obra":
					case "Réplica":
					case "Tréplica":
						try{
							vol = Integer.parseInt(volume.getText());
							if(! (vol >=1 && vol <=21)){
								JOptionPane.showMessageDialog(null, "O volume deve ser compreendido entre 1 e 21");
								volume.setText(null);
								volume.requestFocus();
								aprovado = 0;
							}
						}catch(Exception e2){
							JOptionPane.showMessageDialog(null, "O volume não pode estar vazio");
							volume.requestFocus();
							aprovado = 0;
						}
						break;
					case "Histórico":
						try{
							vol = Integer.parseInt(volume.getText());
							if(! (vol >=1 && vol <=943)){
								JOptionPane.showMessageDialog(null, "O volume deve ser compreendido entre 1 e 943");
								volume.setText(null);
								volume.requestFocus();
								aprovado = 0;
							}
						}catch(Exception e2){
							JOptionPane.showMessageDialog(null, "O volume não pode estar vazio");
							volume.requestFocus();						
							aprovado = 0;
						}
						break;
					case "Amarelo":
					case "Prospécto":
						if(completa == "Selecione"){
							JOptionPane.showMessageDialog(null, "Escolha um ítem do complemento");							
							complemento.requestFocus();
							aprovado = 0;
						}						
						break;				
					default:
						aprovado = 1;
						break;
					}
						
					
					if(aprovado == 1){
						int livro = 0;
						try{
							qtd = Integer.parseInt(quantidade.getText());
							if(qtd <= 0){
								JOptionPane.showMessageDialog(null, "A quantidade tem que ser maior do que zero");
								quantidade.setText(null);
								quantidade.requestFocus();
							}else{
								idiomaSolicitado = String.valueOf(idioma.getSelectedItem());							
								String nome = "";						
								switch(escolha){
								case "B":
									sql = "SELECT valor FROM tb_precos WHERE id_tab_preco = 9";
									idTabelaLivro = 99999;	
									idTabelaPreco = 9;
									break;
									
								case "D":
									sql = "SELECT valor FROM tb_precos WHERE id_tab_preco = 10";
									idTabelaLivro = 99998;
									idTabelaPreco = 10;
									break;
									
								case "F":
									sql = "SELECT valor FROM tb_precos WHERE id_tab_preco = 11";
									idTabelaLivro = 99997;		
									idTabelaPreco = 11;
									break;
									
								case "Cavaleiro":
									sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome    FROM tb_precos preco " +
											"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
											"WHERE liv.num_tipo = 6 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = '0' ";
									livro = 1;
									idTabelaPreco = 7;
									volumeSolicitado = 0;
									break;
									
								case "Obra":
									volumeSolicitado = Integer.parseInt(volume.getText());
									sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome    FROM tb_precos preco " +
											"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
											"WHERE liv.num_tipo = 1 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = '0' " +
											"AND liv.volume = '"+volumeSolicitado+"'";
									livro = 1;
									idTabelaPreco = 1;
									break;
								case "Réplica":	
									volumeSolicitado = Integer.parseInt(volume.getText());
									sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome    FROM tb_precos preco " +
											"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
											"WHERE liv.num_tipo = 2 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = '0' " +
											"AND liv.volume = '"+volumeSolicitado+"'";
									livro = 1;
									idTabelaPreco = 2;
									break;
								case "Tréplica":
									volumeSolicitado = Integer.parseInt(volume.getText());
									sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome    FROM tb_precos preco " +
										"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
										"WHERE liv.num_tipo = 3 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = '0' " +
										"AND liv.volume = '"+volumeSolicitado+"'";
									livro = 1;
									idTabelaPreco = 3;
									break;
								case "Histórico":
									volumeSolicitado = Integer.parseInt(volume.getText());
									if(volumeSolicitado <= 355){
										sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome    FROM tb_precos preco " +
												"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
												"WHERE liv.num_tipo = 4 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = '0' " +
												"AND liv.volume = '"+volumeSolicitado+"' AND preco.id_tab_preco = 4";
										idTabelaPreco = 4;
									}else{
										sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome    FROM tb_precos preco " +
												"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
												"WHERE liv.num_tipo = 4 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = '0' " +
												"AND liv.volume = '"+volumeSolicitado+"' AND preco.id_tab_preco = 5";
										idTabelaPreco = 5;
									}
									livro = 1;
									
									break;
								case "Prospécto":
									sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome  FROM tb_precos preco "+
											"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
											"WHERE liv.num_tipo = 7 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = 0 "+
											"AND liv.nome = '"+completa+"' AND preco.id_tab_preco = 8";
									idTabelaPreco = 8;
									livro = 1;
									volumeSolicitado = 0;
									break;
								case "Amarelo":								
									sql = "SELECT preco.valor, liv.quantidade, liv.idlivro, liv.nome  FROM tb_precos preco "+
											"INNER JOIN livros liv ON liv.num_tipo = preco.num_tipo " +
											"WHERE liv.num_tipo = 5 AND liv.lingua = '"+idiomaSolicitado+"' AND liv.inativo = 0 "+
											"AND liv.nome = '"+completa+"' AND preco.id_tab_preco = 6";
									idTabelaPreco = 6;
									livro = 1;
									volumeSolicitado = 0;
									break;
								}							
								rs = ConsultaBanco(sql);
								String nomeLivro = "";
								try{
									while(rs.next()){
										valorLivro = rs.getFloat(1);
										estoque = rs.getInt(2);	
										idTabelaLivro = rs.getInt(3);
										nomeLivro = rs.getString(4);
									}
								}catch(SQLException e2){
									e2.printStackTrace();
								}
								if (livro == 1){
									lblQuantidadeMximaPermitida.setText("Quantidade máxima permitida: "+estoque);
									if(estoque < qtd){
										lblQuantidadeMximaPermitida.setVisible(true);
									}else{
										//aki vou verificar se existe o item e posteriormente  inserir o ítem no objeto "SOLICITAÇÃO caso ja não exista"
										boolean existe = false;
										for (Livro p : pedidoNew) {  
									       if(p.getID() == idTabelaLivro){
									    	   existe = true;
									       }
									    }  
										if(existe == false){										
											Livro novoLivro = new Livro(idTabelaLivro, qtd, volumeSolicitado, valorLivro, idTabelaPreco ,idioma.getSelectedItem().toString(), item.getSelectedItem().toString(), nomeLivro);
											pedidoNew.add(novoLivro);										
											alteraTableVisual();
											teveAlteracao = true;
											int estoqNew = estoque - qtd;
											sql = "UPDATE livros SET quantidade = '"+estoqNew+"' WHERE idlivro = "+idTabelaLivro;
											GravaBanco(sql);
										}else{
											JOptionPane.showMessageDialog(null, "Este ítem já foi inserido no pedido, favor escolher outro");
										}
									}
								}else{
									//se for banho fumo ou defumador
									boolean existe = false;
									for (Livro p : pedidoNew) {  
								       if(p.getID() == idTabelaLivro){
								    	   existe = true;
								       }
								    }
									if(existe == false){
										rs = ConsultaBanco(sql);
										try{
											while(rs.next()){
												valorLivro = rs.getFloat(1);											
											}
										}catch(SQLException e2){
											e2.printStackTrace();
										}
										Livro novoLivro = new Livro(idTabelaLivro, qtd, 0, valorLivro, idTabelaPreco, "", item.getSelectedItem().toString(), "");
										pedidoNew.add(novoLivro);									
										alteraTableVisual();
										teveAlteracao = true;										
									}else{
										JOptionPane.showMessageDialog(null, "Este ítem já foi inserido no pedido, favor escolher outro");
									}
								}
								
							}
						}catch(Exception e2){
							e2.getStackTrace();
							quantidade.setText(null);
							JOptionPane.showMessageDialog(null, "A quantidade não pode estar vazia");
							quantidade.requestFocus();
							
						}
					}
						
				}
				
			}
		});	
		
		item.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				quantidade.setText(null);
				String escolha = String.valueOf(item.getSelectedItem());
				lblQuantidadeMximaPermitida.setVisible(false);
				switch(escolha){
				case "Amarelo":
					volume.setText(null);					
					volume.setEnabled(false);
					complemento.setEnabled(true);
					complemento.removeAllItems();
					complemento.addItem("Selecione");
					complemento.addItem("AMARELÃO - MJC");
					complemento.addItem("FININHO");
					complemento.addItem("ORELHÃO - RS");
					complemento.requestFocus();
					break;
				case "Prospécto":
					volume.setText(null);
					volume.setEnabled(false);
					complemento.setEnabled(true);
					complemento.removeAllItems();
					complemento.addItem("Selecione");
					complemento.addItem("CR");
					complemento.addItem("CV");
					complemento.requestFocus();
					break;
				case "Obra":
				case "Réplica":
				case "Tréplica":
				case "Histórico":
					volume.setText(null);
					volume.setEnabled(true);					
					volume.requestFocus();
					complemento.removeAllItems();
					complemento.addItem("Selecione");
					complemento.setEnabled(false);
					break;				
				default:					
					volume.setText(null);
					volume.setEnabled(false);
					complemento.removeAllItems();
					complemento.addItem("Selecione");
					complemento.setEnabled(false);
					break;	
				}
			}
		});
		
		alterarQuantidade.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				excluirItem.setSelected(false);
				alterarQuantidade.setSelected(true);
				qtdAlterar.setEnabled(true);
				qtdAlterar.setText(null);
			}
		});
		excluirItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				alterarQuantidade.setSelected(false);
				excluirItem.setSelected(true);
				qtdAlterar.setEnabled(false);
				qtdAlterar.setText(null);
			}
		});
		
		processa.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				int id = (Integer.parseInt(idPedido.getText()))-1;
				int teste;
				try{
					teste = pedidoNew.get(id).getQuantidade();//testando se o id existe e pegando a quantidade caso seja selecionada
					int idBanco = pedidoNew.get(id).getID();
					if(alterarQuantidade.isSelected() == true){
						//fazer quando tiver marcado a alteração de quantidade
						int valorNovo = Integer.parseInt(qtdAlterar.getText());
						if(valorNovo <= 0){
							JOptionPane.showMessageDialog(null, "O valor digitado deve ser maior do que zero");
							qtdAlterar.setText(null);
							qtdAlterar.requestFocus();
						}else{
							if(idBanco >= 9997){
								pedidoNew.get(id).setQuantidade(valorNovo);
								alteraTableVisual();
								idPedido.setText(null);
								qtdAlterar.setText(null);
								idPedido.requestFocus();
								teveAlteracao = true;								
							}else{
								int diferenca, estoque = 0;
								sql = "SELECT quantidade FROM livros WHERE idlivro = "+idBanco;
								rs = ConsultaBanco(sql);
								try{
									while(rs.next()){
										estoque = rs.getInt(1);	
									}
								}catch (SQLException e2) {			
									e2.printStackTrace();
								}
								if(valorNovo < teste){
									diferenca = teste - valorNovo;								
									estoque = estoque + diferenca;
									sql = "UPDATE livros SET quantidade = '"+estoque+"' WHERE idlivro = "+idBanco;
									GravaBanco(sql);
									pedidoNew.get(id).setQuantidade(valorNovo);
									alteraTableVisual();
									idPedido.setText(null);
									qtdAlterar.setText(null);
									idPedido.requestFocus();
									teveAlteracao = true;
								}else if(valorNovo > teste){
									diferenca = valorNovo - teste;
									if(estoque >= diferenca){
										estoque = estoque - diferenca;
										sql = "UPDATE livros SET quantidade = '"+estoque+"' WHERE idlivro = "+idBanco;
										GravaBanco(sql);
										pedidoNew.get(id).setQuantidade(valorNovo);
										alteraTableVisual();
										idPedido.setText(null);
										qtdAlterar.setText(null);
										idPedido.requestFocus();
										teveAlteracao = true;
									}else{
										diferenca = estoque + teste; 
										JOptionPane.showMessageDialog(null, "O limite para aumentar o ítem no momento é de "+diferenca+" livros" );
										qtdAlterar.setText(null);
										qtdAlterar.requestFocus();
									}
							}
							
							}
						}
						
					}else{
						//fazer quando tiver marcado a exclusão de ítem
						int estoq = 0;
						sql = "SELECT quantidade FROM livros WHERE idlivro = "+idBanco;
						rs = ConsultaBanco(sql);
						try{
							while(rs.next()){
								estoq = rs.getInt(1);	
							}
						}catch (SQLException e2) {			
							e2.printStackTrace();
						}
						estoq = estoq + teste;
						sql = "UPDATE livros SET quantidade = '"+estoq+"' WHERE idlivro = "+idBanco;
						GravaBanco(sql);
						pedidoNew.remove(id);
						alteraTableVisual();
						idPedido.setText(null);
						teveAlteracao = true;
					}
					
				}catch(Exception e){
					JOptionPane.showMessageDialog(null,"O ID selecionado não existe");
					idPedido.setText(null);
					qtdAlterar.setText(null);
					idPedido.requestFocus();
				}				
			}
		});
	}
}

como podem ver eu altero apenas a quantidade do pedidoNew nas linhas 884 e 896, mas quando isso ocorre o sistema também altera a quantidade no pedidoOld

Porque isso acontece e como solucionar meu problema?

3 Respostas

AlexandreTLazaro

kra, soh uma coisa…põe somente o trecho q interessa aih…senão kra, fica meio difícl de ler td teu código e dpois ajudá-lo…

geraldofrancisco

Alexandre, me desculpe mas eu sou novo em programação. Então achei que ajudaria colocar o código todo.

Mas consegui descobrir o problema, quando mando clonar o arraylist parece que eles criam vínculos que quando altero 1 acaba alterando os 2. Resolvi da seguinte maneira…

criei uma função para carregar cada array de forma individual, passando eles de parâmetro assim o vínculo deixa de existir. Obrigado pela ajuda!

AlexandreTLazaro

blz kra, não tem problema…agora, soh coloque aih no título do seu tópico [Resolvido]…blz…flw!

Criado 6 de março de 2013
Ultima resposta 6 de mar. de 2013
Respostas 3
Participantes 2