Row und Cell Änderungen feststellen

byron1778

Aktives Mitglied
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
 

byron1778

Aktives Mitglied
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!
 

André Uhres

Top Contributor
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é
 

byron1778

Aktives Mitglied
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
W JavaFX Etwas Tabellenartiges + Cell-Content-Changed-Event (o.ä.) AWT, Swing, JavaFX & SWT 30
J CheckTreeView mit eigenem Cell Value AWT, Swing, JavaFX & SWT 3
E JavaFX Von der Table-Cell zur Row AWT, Swing, JavaFX & SWT 0
K JavaFX Mehrere Cell Editors in einem TreeView Item AWT, Swing, JavaFX & SWT 2
X JavaFX TableView selektierung der cell wie begrenzen? AWT, Swing, JavaFX & SWT 0
S SWT TableCell mit Composite als Inhalt / Höhe der Cell/Row AWT, Swing, JavaFX & SWT 5
M JTable Cell Renderer- Terminplaner AWT, Swing, JavaFX & SWT 2
A JTable Cell Eingabe AWT, Swing, JavaFX & SWT 6
T JTable Cell Refresh AWT, Swing, JavaFX & SWT 5
H default cell renderer AWT, Swing, JavaFX & SWT 3
J Swing JTable cell-ausrichtung für zahlen mit alternierenden zeilenfarben AWT, Swing, JavaFX & SWT 2
A Swing JButton in einer Table Cell AWT, Swing, JavaFX & SWT 9
B LookAndFeel Cell Renderer für JTable bei Nimbus Look and Feel AWT, Swing, JavaFX & SWT 2
M Swing JTable cell leeren bei Eingabe AWT, Swing, JavaFX & SWT 6
C Swing JTable: edit Cell -> versteckten Wert ändern AWT, Swing, JavaFX & SWT 12
A Focus in JTable Cell AWT, Swing, JavaFX & SWT 3
S Color in Cell AWT, Swing, JavaFX & SWT 2
O JTable Edit cell edit end erzwingen... AWT, Swing, JavaFX & SWT 7
G Cell Renderer AWT, Swing, JavaFX & SWT 5
Tom299 Cell Renderer mit Link AWT, Swing, JavaFX & SWT 2
O JCombobox in EINER JTable Cell AWT, Swing, JavaFX & SWT 5
D Problem bei meinem Cell Renderer AWT, Swing, JavaFX & SWT 2
J Cell Farbe in JTable AWT, Swing, JavaFX & SWT 31
C Proleme mit eigenem Cell Renderer AWT, Swing, JavaFX & SWT 3
H mehrere cell renderers AWT, Swing, JavaFX & SWT 5
M Select cell AWT, Swing, JavaFX & SWT 3
S JTable - farbe einer cell/row ändern, Hilfe please AWT, Swing, JavaFX & SWT 2
clemson Cursor in JTable-Cell setzen AWT, Swing, JavaFX & SWT 6
D JTable - Hintergrundbild in Cell AWT, Swing, JavaFX & SWT 6
P JavaFX Änderungen am Datenmodell visuell nicht sichtbar AWT, Swing, JavaFX & SWT 3
G JTextField Änderungen überprüfen AWT, Swing, JavaFX & SWT 4
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Swing JTextComponent markieren bei Änderungen AWT, Swing, JavaFX & SWT 5
S JTable übernimmt Änderungen nicht AWT, Swing, JavaFX & SWT 2
G JavaFX TableView - Änderungen werden nicht übernommen. AWT, Swing, JavaFX & SWT 3
S Swing Auf Änderungen eines Models in der View einer JTable reagieren AWT, Swing, JavaFX & SWT 1
X Swing GUI-Änderungen mit invokeLater AWT, Swing, JavaFX & SWT 4
D Änderungen einer Card des CardLayouts zur Laufzeit AWT, Swing, JavaFX & SWT 6
M Swing Änderungen eines TextFelds und JOptionPane AWT, Swing, JavaFX & SWT 5
J JTable DefaultTableModel - Änderungen feststellen AWT, Swing, JavaFX & SWT 8
C Übernahme von Änderungen in einer JTable AWT, Swing, JavaFX & SWT 7
J Verzögerung bei Änderungen der Anzeige abwarten AWT, Swing, JavaFX & SWT 5
R Swing 2 jTables -2 Models - 1 Datenklasse: Änderungen AWT, Swing, JavaFX & SWT 11
M In Jlist auf Änderungen von mehreren JLabels reagieren AWT, Swing, JavaFX & SWT 3
Pithecanthropus [gelöst ]ActionListener soll nur Änderungen "bemerken" AWT, Swing, JavaFX & SWT 2
B Keine Änderungen an JLabel durch Array möglich AWT, Swing, JavaFX & SWT 12
U Beste Möglichkeit JTable-Änderungen in DB zu schreiben? AWT, Swing, JavaFX & SWT 14
S Textfeld soll auf Änderungen von nutzer und program reagiern AWT, Swing, JavaFX & SWT 3
P Änderungen in xml datei speichern AWT, Swing, JavaFX & SWT 7
A JTable Änderungen anzeigen (DefaultTableModel) AWT, Swing, JavaFX & SWT 5
T JTable Änderungen AWT, Swing, JavaFX & SWT 2
M Änderungen an JPanel nicht sichtbar AWT, Swing, JavaFX & SWT 8
S Swing: Änderungen in JLabel oder JTextField sofort anzeigen AWT, Swing, JavaFX & SWT 3
J JavaFX - Included FXML - Entfernen feststellen AWT, Swing, JavaFX & SWT 2
G Swing Feststellen ob in JFrame Decorations geklickt wurde? AWT, Swing, JavaFX & SWT 4
G Wasserzeichen in Bildern feststellen AWT, Swing, JavaFX & SWT 6
H Feststellen ob eine Componente sichtbar (im Vordergund) ist? AWT, Swing, JavaFX & SWT 2
kodela Dimensionierung von Fensterkomponenten feststellen AWT, Swing, JavaFX & SWT 4
T Feststellen woher KlickEvent kommt AWT, Swing, JavaFX & SWT 3
robinab JScrollPane: wie feststellen, ob die HorizontalBar an ist? AWT, Swing, JavaFX & SWT 2
T JList + Doppelklick feststellen AWT, Swing, JavaFX & SWT 4
O feststellen ob JComboBox getSelectedItem() ohne Inhalt! AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben