JTable problem

0

Witam serdecznie,

Jestem początkującym programistą języka Java i pierwszy raz mam styczność z komponentami JTable. Jestem w trakcje pisania małego programiku który będzie tworzył tabelę w której będą znajdować się produkty. Podczas dodawania kolejnych produktów chcę żeby program sprawdzał czy w istniejących już wierszach istnieje produkt który ma taką samą nazwę i taką samą cenę jeżeli tak to zamiast dodawać nowy produkt do tabeli ma dodawać do już istniejącego wiersza ilość sztuk. Problem zaznaczyłem komentarzem w kodzie. Ogólnie proszę też o uwagi i ewentualnie inne propozycje bo może robię wszystko okrężną drogą.

Pozdrawiam Grzesiek

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class Tabela extends JPanel{
	
	private static int licznik = 1;
	private final int NAZWA = 0;
	private final int WIERSZ = 0;
	private final int ILOSC = 1;
	private final int CENA = 2;
	private final int PIERWSZA = 0;
	private final int DRUGA = 1;
	
	private String[] columnNames = {"Lp.", "Nazwa", "Ilość", "Rabat [%]", "Cena", "Suma",};
	private String[] columnNameTemp = {"Nazwa","Ilość","Cena",};
	
	private Object[][] data;
	private Object[][] dataTemp = {{"Ozdoby do włosów", "1", "0.0"}};
	
	private final DefaultTableModel model = new DefaultTableModel(data, columnNames);
	private final JTable tab = new JTable(model);
	
	private final DefaultTableModel modelTemp = new DefaultTableModel(dataTemp, columnNameTemp);
	private final JTable tabTemp = new JTable(modelTemp);
	
	private DecimalFormat df = new DecimalFormat("#.##");
	
	public Tabela(){

		tab.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
		tab.setPreferredScrollableViewportSize(new Dimension(700, 400));
        tab.setFillsViewportHeight(true);
        tab.setRowHeight(20);
        
		TableColumn column = null;
		
		column = tab.getColumnModel().getColumn(PIERWSZA);
		column.setPreferredWidth(10);
		column = tab.getColumnModel().getColumn(DRUGA);
		column.setPreferredWidth(300);
		
		tabTemp.setPreferredScrollableViewportSize(new Dimension(700, 20));
        tabTemp.setFillsViewportHeight(true);
        tabTemp.setAutoResizeMode(JTable.AUTO_RESIZE_NEXT_COLUMN);
        tabTemp.setRowHeight(20);
		column = tabTemp.getColumnModel().getColumn(PIERWSZA);
		column.setPreferredWidth(300);
		
		JComboBox comboBox = new JComboBox();
		comboBox.addItem("Ozdoby do włosów");
		comboBox.addItem("Biżuteria sztuczna");
		comboBox.addItem("Pudełka");
		column.setCellEditor(new DefaultCellEditor(comboBox));
		
        JButton dodaj = new JButton("Dodaj");
        dodaj.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                	
                	String nazwa = (String)tabTemp.getModel().getValueAt(WIERSZ, NAZWA);
                	 
                	String ilosc = (String)tabTemp.getValueAt(WIERSZ, ILOSC);
                	int iloscT = Integer.parseInt(ilosc);
                	
                	String cena = (String)tabTemp.getModel().getValueAt(WIERSZ, CENA);
                	double cenaT = Double.parseDouble(cena);
                	
                	
                	//Problem zaczuna sie tutaj !!! :)
                	for(int i = 0; i < model.getRowCount(); i++){
                		System.out.println(model.getRowCount());
                		
                		//Narazie porownuje tylko same ceny
	                	if(cena.equals((String)tab.getModel().getValueAt(i, 4))){
	                		System.out.println("Taka sama ilosc");
	                		
	                		int temp = 0;
                			String tempIlosciBedacej = (String)tab.getModel().getValueAt(i, 2);
                			temp = Integer.parseInt(tempIlosciBedacej);
                			
	                		tab.setValueAt((ilosc+temp), i, 2);
	                		
	                		if(i >= 1){
	                			model.removeRow(i);
	                			licznik--;
	                		}
                			
	                	}else
	                		System.out.println("Inna ilosc");
                	}
                	
                    Object[] dd = {licznik++ ,nazwa , ilosc, "", cena, df.format(iloscT*cenaT)};
                    model.addRow(dd);
                    refresh();
                }
        });
        
        JButton nowy = new JButton("Nowy");
        nowy.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                	while (model.getRowCount()>0){
                		model.removeRow(0);
                	}
                	licznik = 1;
                }
        });
        
		setLayout(new BorderLayout());
		add(new JScrollPane(tab),BorderLayout.NORTH);
		add(new JScrollPane(tabTemp),BorderLayout.CENTER);
		add(nowy,BorderLayout.SOUTH);
		add(dodaj,BorderLayout.EAST);
	}
	
	private void refresh(){
		tab.scrollRectToVisible(tab.getCellRect(tab.getRowCount()-1,tab.getColumnCount(), true));
	}
	
    private static void createAndShowGUI() {

        JFrame frame = new JFrame("TableDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Tabela newContentPane = new Tabela();
        newContentPane.setOpaque(true);
        frame.setContentPane(newContentPane);

        frame.pack();
        frame.setVisible(true);
    }
    
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                    createAndShowGUI();
            }
        });
	}
}

0

Szczerze to kodu nie czytałem, pokoloruj składnię... [code=java]

IMHO powinieneś stworzyć sobie własny model tabeli dziedziczący po AbstractTableModel.
W nim przechowywać kolekcją produktów i to w nim sprawdzać czy dodawany produkt istnieje już w kolekcji. Takie rozwiązanie sprowadza się na operowaniu na kolekcji co jest znaczne prostsze do napisania, najprościej ArrayList, ale może do Twojego problemu do pasujesz inną.

1 użytkowników online, w tym zalogowanych: 0, gości: 1