Row und Cell Änderungen feststellen

  • Themenstarter Themenstarter Gelöschtes Mitglied 17508
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 17508

Gast
Hallo Forum!

Ich habe bei meinem Programm folgendes Problem.
Ich habe 4 Spalten, wobei die letzte Spalte ein Drop - Down Menue ist, wo es zur Auswahl ( OK, NOK, ... ) gibt!
Jetzt möchte ich, wenn z. B: die Drop - Down Spalte auf einen neuen Wert geändert wird, dass der User auch dazu verpflichtet ist, die erste Spalte zu ändern ( was dort für ein Wert drinnen steht ist für das Erste einmal egal! ).

Der User soll aber erst benachrichtigt werden, dass die erste Spalte auch zu ändern ist, wenn er versucht die JTable mittels den Button "OK" wieder in die Datenbank zurückzuschreiben!

Jetzt wollte ich gerne wissen, ob das überhaupt möglich ist, so umzusetzen?
Ich lese mir die Daten aus der Datenbank/Tabelle mittels einen Vektor aus:

Hier einmal der Code ( ist nicht schön, es dient im Moment auch nur zur Veranschaulichung! ):

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.DefaultCellEditor;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableColumn;
import static java.lang.System.out;
import static java.lang.System.exit;

public class CJTableAenderung implements CellEditorListener{

	JFrame FirstFrame;
	JTable table;
	JFrame f1;
	TableColumn column;
	JComboBox comboBox;
	JPanel panel;
	JButton back;
	JButton ok;
	JButton cancel;
	Vector<Vector<Object>> data;
	Vector<String> columnNames;
	
	public CJTableAenderung (JFrame f) throws SQLException, IOException {
		// TODO Auto-generated constructor stub
		
		this.FirstFrame = f;
		
		//Get Properties
		Properties prop = new Properties();
		prop.load(new FileInputStream("C:\\config.properties"));
		
		//Get the sytem user with domain
		String line;
		Runtime rt = Runtime.getRuntime();
		Process p = rt.exec("C:\\WINDOWS\\system32\\cmd.exe /c echo %userdomain%");
		BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
		while ((line = bri.readLine()) != null) {
			out.println(line);
		}
		bri.close();
		
		panel = new JPanel();
		back = new JButton("BackToVolaModel");
		ok = new JButton("Ok");
		cancel = new JButton("Cancel");
		data = new Vector<Vector<Object>>();
		columnNames = new Vector<String>();
		
		try {
			Class.forName ("net.sourceforge.jtds.jdbc.Driver");
			//Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + prop.getProperty("server") + ":" + prop.getProperty("port") + "/" + prop.getProperty("database"), prop.getProperty("username"), prop.getProperty("password"));
			Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://s0196vss132:1433/ScenarioGenerator", prop.getProperty("username"), prop.getProperty("password"));
			Statement st = con.createStatement();
			//ResultSet maxRs = st.executeQuery("SELECT * FROM tblQADataPoints");
			ResultSet maxRs = st.executeQuery("SELECT * FROM Logging");
			//ResultSet DateRs = st.executeQuery("SELECT * FROM tblQADataPoints WHERE Datum = ");
			ResultSetMetaData metaData=maxRs.getMetaData();
			final int columns = metaData.getColumnCount();
			for ( int i = 1; i <= columns; i++ ) {
				columnNames.addElement(metaData.getColumnName(i));
			}
			while(maxRs.next()){
				Vector<Object> row = new Vector<Object>(columns);
				for ( int i = 1; i <= columns; i++ ) {
					row.addElement(maxRs.getObject(i));
				}
				data.addElement(row);
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		f1 = new JFrame("SmileFitting");
		table = new JTable(data, columnNames);
		table.getDefaultEditor(String.class).addCellEditorListener(this);
		column = table.getColumnModel().getColumn(1);
		comboBox = new JComboBox();
		comboBox.addItem("OK");
		comboBox.addItem("overwrite");
		comboBox.addItem("missing");
		comboBox.addItem("suspect");
		column.setCellEditor(new DefaultCellEditor(comboBox));
		panel.add(back);
		panel.add(ok);
		panel.add(cancel);
		f1.setLocation(501, 0);
		f1.setSize(500, 500);
		f1.add(new JScrollPane(table));
		f1.add(panel, BorderLayout.SOUTH);
		f1.setDefaultCloseOperation(f1.EXIT_ON_CLOSE);
		f1.setVisible(true);
		
		ok.addActionListener(new ActionListener() {
	        @Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
	        	if ( ok.getText() == "Ok") {
	        		//GapsFilling gaps = new GapsFilling();
	        		f1.setEnabled(false);
	        		JFrame f = new JFrame("JProgressBar");
	        	    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	        	    Container content = f.getContentPane();
	        	    JProgressBar progressBar = new JProgressBar();
	        	    progressBar.setIndeterminate(true);
	        	    Border border = BorderFactory.createTitledBorder("Working...");
	        	    progressBar.setBorder(border);
	        	    content.add(progressBar, BorderLayout.NORTH);
	        	    f.setSize(300, 100);
	        	    f.setVisible(true);
	        	    f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
	        	}
			}
	      });
		
		cancel.addActionListener(new ActionListener() {
	        @Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
	        	if ( cancel.getText() == "Cancel") {
	        		exit(99);
	        	}
			}
	      });
		
		back.addActionListener(new ActionListener() {
	        @Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
	        	if ( back.getText() == "BackToVolaModel") {
	        		FirstFrame.setEnabled(true);
	        		f1.dispose();
	        	}
			}
	      });
		}

	@Override
	public void editingCanceled(ChangeEvent arg0) {
		// TODO Auto-generated method stub
        System.out.println("Editing of a cell has been canceled.");
        System.out.println("editingCanceled: " + arg0.getSource());
	}

	@Override
	public void editingStopped(ChangeEvent arg0) {
		// TODO Auto-generated method stub
        System.out.println("A cell has been edited.");
        System.out.println("editingStopped: " + arg0.getSource());
	}
}

Ich danke Euch schon einmal für Eure Hilfen!

lG
 
Ich antworte mir einmal selber 🙂
So wie ich es mir vorgestellt habe, wird es leider nicht funktionieren.
Man muss das Ganze selber implementieren.

In meinem Fall die beiden Vektoren vergleichen und die gewünschten Stellen, welche geänderten wurden in eine Beziehung setzen und ggfalls dann den User benachrichtigen, dass auch die anderen Felder dahingehend abgeändert werden müssen!

Schade, ich hoffte, dass zu einem Grossteil es schon so eine (abstrakte) Klasse geben könnte!
 
ich hoffte, dass zu einem Großteil es schon so eine (abstrakte) Klasse geben könnte!

Ich bin mir nicht sicher (ich habe das nur überflogen), aber ein PropertyChangeListener könnte vielleicht helfen. Eine JTable feuert nämlich einen PropertyChangeEvent, wenn eine Zelle:

die Bearbeitung beginnt - deshalb können wir den aktuellen Wert der Zelle speichern, bevor er geändert wird (den alten Wert)
die Bearbeitung beendet - daher können wir den aktuellen Wert der Zelle (den neue Wert) abrufen. Darüber hinaus können wir nun die Werte "alt/neu" vergleichen und eine Verarbeitung aufrufen, wenn sie verschieden sind.

Gruß,
André
 
Ah ok, danke Dir vielmals!

PropertyChangeListener hört sich interessant an, muss ich mir mal ansehen!
Wichtig ist mir halt, dass der User in der GUI bestimmte Spalten ändern darf ( ca. 3 Spalten sind es ) und wenn er dann alle seine Änderungen durchgenommen hat ( können dann an die 100 Rows sein, wobei wie gesagt nur 3 Spalten geändert werden dürfen ) und jetzt auf OK klickt, dann erst sollen die 3 Spalten verglichen werden, also nicht sofort, wenn eine Zeile geändert wurde!

Ich werde mir das einmal mit dem PropertyChangeListener ansehen, ob ich da irgendwie 3 Spalten und die 100 Rows im Speicher halten kann und erst wenn der User auf OK klickt mit dem Vergleichen anfange!

Gruss,
Bernd
 

Neue Themen


Zurück
Oben