2 voneinander abhängige Tables

chawo87

Mitglied
Morgen,

ich habe folgendes Problem ich erstelle auf meiner GUI zwei JTables diese sollen abhängig voneinander arbeiten

tableyt.jpg



Wenn ich jetz in der oberen Tabelle Hardware den ersten Eintrag mit der Domain "abc" auswähle sollen in der unteren Tabelle Software nur die Daten angezeigt werden, die die gleiche Domain haben also nur die Einträge mit der Domain "abc"

hier mal noch der code der softwaretabelle

Java:
public void createSwTable(){
		if(connection.conn !=null){
			try {
				PreparedStatement statement = connection.conn.prepareStatement(swAnzeigestring);
				ResultSet swrs;
				swrs=statement.executeQuery();
								
				String columnName1 = swrs.getMetaData().getColumnName(1);
				String columnName2 = swrs.getMetaData().getColumnName(2);
	            String columnName3 = swrs.getMetaData().getColumnName(3);
	            String columnName4 = swrs.getMetaData().getColumnName(4);
	            swColumnheaders[0] = columnName1;
	            swColumnheaders[1] = columnName2;
	            swColumnheaders[2] = columnName3;
	            swColumnheaders[3] = columnName4;
	            while(swrs.next()){
		            String[] row = new String[4];
		            String column1 = swrs.getString(1);
		            String column2 = swrs.getString(2);
		            String column3 = swrs.getString(3);
		            String column4 = swrs.getString(4);
	                row[0] = column1;
	                row[1] = column2;
		            row[2] = column3;
		            row[3] = column4;
		            swrows.add(row);
	            }
    		    							
			} catch (SQLException ex) {
				ex.printStackTrace();
			}
			
	        Object[][] data = new Object[swrows.size()][];
	        for (int i = 0; i < swrows.size(); i++) {
	            data[i] = swrows.get(i);
	        }
	        JTable swanzeigeTable = new JTable(data, swColumnheaders);
	        TableColumn col = swanzeigeTable.getColumnModel().getColumn(0);
	        col.setMaxWidth(20);
		    JScrollPane scrollPane = new JScrollPane(swanzeigeTable);
		    scrollPane.setBounds(350,470,550,175);		   
		    panel.add(scrollPane);
		} 
    }
 
S

SlaterB

Gast
Java:
table.getSelectionModel().addListSelectionListener(new ListSelectionListener()
            {
                public void valueChanged(ListSelectionEvent e)
                {
                    int index = table.getSelectedRow();
                    // mit der Information der selektierten Zeile nun irgendwas machen
                }
            });
 

Michael...

Top Contributor
Am einfachsten wäre es vermutlich die gewählte Domain aus Tabelle1 als Kriterium für eine Datenbankabfrage zu verwenden und die Tabelle2 mit neuen Daten zu befüllen. Hätte halt zur Folge, dass die Applikation dauernd mit der Datenbank kommunzieren muss.

Eine andere Möglichkeit das TableModel der zweiten Tabelle ensprechend der Domain zu filtern. Aber so Dein Code ausschaut, ist Dir die Existenz eines TableModel garnicht bewusst.

Grundsätzlich ist es überflüssig, für eine Aktualisierung der Daten jedes mal eine neue JTable zu erzeugen (weiss nicht wie oft das PreparedStatement im Code unten aufgerufen wird). I.d.R. reicht es aus die neuen Daten einfach an das TableModel zu übergeben, oder notfalls das Model in der JTable neu zusetzen.
 

chawo87

Mitglied
[JAVA=42] public void createHwTable(){
final JTable hwtable;
DefaultTableModel defaultTableModel;
defaultTableModel = new DefaultTableModel();
defaultTableModel.setColumnIdentifiers(hwColumnNames);
hwtable = new JTable(defaultTableModel);
JScrollPane scrollPane = new JScrollPane(hwtable);
scrollPane.setBounds(350,70,550,325);
panel.add(scrollPane);
Vector<?> hwresults = getHardware();
defaultTableModel.setDataVector(hwresults, hwColumnNames);
TableColumn col = hwtable.getColumnModel().getColumn(0);
col.setMinWidth(0);
col.setMaxWidth(0);
hwtable.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
int index = hwtable.getSelectedRow();
hwIDTextField.setText((String) hwtable.getValueAt(index, 0));
inventarNrTextField.setText((String) hwtable.getValueAt(index, 1));
serienNrTextField.setText((String) hwtable.getValueAt(index, 2));
kaufdatumTextField.setText((String) hwtable.getValueAt(index, 3));
hwdomainTextField.setText((String) hwtable.getValueAt(index, 4));
modelTextField.setText((String) hwtable.getValueAt(index, 5));
typTextField.setText((String) hwtable.getValueAt(index, 6));
createSwTable();
}
});
}[/code]

[JAVA=42] protected Vector<Vector<String>> getHardware() {
Vector<Vector<String>> hwresults = new Vector<Vector<String>>();
try {
Statement statement = connection.conn.createStatement();
ResultSet rs = statement.executeQuery("SELECT * FROM hardware");

while (rs.next()) {
Vector<String> hardware = new Vector<String>();
hardware.add(rs.getString("ID"));
hardware.add(rs.getString("Inventarnummer"));
hardware.add(rs.getString("Seriennummer"));
hardware.add(rs.getString("Kaufdatum"));
hardware.add(rs.getString("Domain"));
hardware.add(rs.getString("Model"));
hardware.add(rs.getString("Typ"));
hwresults.add(hardware);
}

} catch (SQLException e) {
e.printStackTrace();
}
return hwresults;
}[/code]

hallo frohes neues jahr

hab die hardwaretabelle jetzt so realisiert und das erstellen der software tabelle bei einem klick auf die entsprechende zeile funktioniert un die richtigen daten werden angezeigt

jedoch hat das programm noch einige kleine bugs wenn ich in der hardwaretable einen wert durch drücken des "Ändern" buttons ändere wird dies vorerst gemacht und auch die daten in der datenbank geändert.
klicke ich aber wieder in die tabelle übernimmt sie wieder den alten wert und die softwaretabelle ist gar nicht anklickbar

hat da vllt jemand nen tipp für mich ?

danke im voraus
 
S

SlaterB

Gast
> klicke ich aber wieder in die tabelle übernimmt sie wieder den alten wert

in die Hardware-Tabelle geklickt? und diese Tabelle ändert sich dann oder eine andere Tabelle?
in jedem Falle: verstehst du vollkommen NICHT warum etwas passiert oder gibt es einen Listener, dann logge in diesem ganz exakt was warum passiert

> und die softwaretabelle ist gar nicht anklickbar

ein technisches unerklärliches Problem oder hast du da Einblicke?
reagiert die GUI an sich schon mit weniger Effekten (Rahmen um selektierte Zelle), funktionier Rest der GUI noch?
oder wird nur wiederum ein Listener nicht wie du es erwartest ausgeführt?

ohne großflächigen Code + genaue Anleitung zum Fehler sehe ich hier schwarz,
idealerweise DB und ähnlich kompliziertes ausbauen, alles mit Dummy-Daten lösen, diese im Programm als String-Liste oder ähnlich durchaus speichern so dass man Daten-Änderungen testen kann
 
Zuletzt bearbeitet von einem Moderator:

chawo87

Mitglied
ich ändere die daten in den textfields durch einen klick auf ändern werden die daten in der datenbank durch "UPDATE" geändert
dannach wird das richtige ergebnis in der hardwaretabelle angezeigt

z.B wen ich den wert "abc" in "123" ändere wird der wert "123" bei domain angezeigt
klicke ich dannach mit der maus wieder in die hardwaretabelle wird der wert "abc" agenzeigt
starte ich das programm nun neu wird der wert "123" angezeigt
 
S

SlaterB

Gast
> klicke ich dannach mit der maus wieder in die hardwaretabelle wird der wert "abc" agenzeigt

wird der wert "abc" IN DEN TEXTFELDERN angezeigt oder ändert sich die Hardware-Tabelle oder passiert ganz was anderes?
zum zweiten Mal muss ich nachfragen was du die ganze Zeit meinst, schreib doch einfach immer deutlich worum es geht,

wobei dieses Verhalten an sich nicht so schwer zu erklären scheint:
dein Listener kopiert die Daten aus der Table in die TextFelder und die Table hat gewiss noch die alten Daten,
von selber passiert wenig, du musst auch die Table-Daten ändern/ neuladen
 

chawo87

Mitglied
so hab jetz ma shcnell 5 screens gemacht

1. programm wird gesatert
31707214.jpg


2. "abc" angklickt
68782987.jpg


3. "abc" im TextField auf "a" geändert und "Ändern" Button gedrückt
39041876.jpg


4. wieder in die Tabelle geklickt "a" ändert sich wieder in "abc"
46229244.jpg


5. programm beendet und programm nochmal neu gestartet geänderter wert "a" ist in der Tabelle
95123447.jpg
 
S

SlaterB

Gast
das ist deutlich, danke ;)

allerdings kann ich diesen Fehler leider nicht direkt nachvollziehen,
hast du noch weitere Infos, Listener an den Textfeldern, Code des Ändern-Buttons, sonstiges wissenswertes wann wo warum die Table geändert werden könnte?
wahrscheinlich ist aber der Stand (für mich) wieder bei Posting 14:56: ganz viel Code posten/ hochladen
 

chawo87

Mitglied
Java:
	protected void hwaendernButtonActionPerformed(ActionEvent evt){
		if(connection.conn !=null){
			try{
				String hwChangestring = "UPDATE hardware SET Inventarnummer='"+inventarNrTextField.getText()+"' " +
						"								    ,Seriennummer='"+serienNrTextField.getText()+"'" +
								"						    ,Kaufdatum='"+kaufdatumTextField.getText()+"'" +
										"				    ,Domain='"+hwdomainTextField.getText()+"'" +
												"		    ,Model='"+modelTextField.getText()+"'" +
														"   ,Typ='"+typTextField.getText()+"'" +
															"WHERE ID='"+hwIDTextField.getText()+"'";				
				PreparedStatement statement = connection.conn.prepareStatement(hwChangestring);
				statement.executeUpdate();				
      			}catch (SQLException ex) {
				ex.printStackTrace();
			}
		}
		createHwTable();
	}

hab auch schon probiert in createHwTabel() vor panel.add(scrollPane) ein panel.remove(scrollPane) einzufügen hat auch nicht funktioniert mit defaultTable.fireDataChanged hats auch nicht geklappt
repaint() funktionierte auch nicht
 
S

SlaterB

Gast
dass du die Komponenten mehrfach erzeugst kann in der Tat schlecht sein,
> panel.remove(scrollPane);
sollte aber wenn dann mit dem alten scrollPane aufgerufen werden, nicht mit dem neuen,
da du das alte nicht in einem Klassenattribut speicherst ist das schwierig,

removeAll(); gibts noch, aber das ist wohl zuviel, einmal kannst du es zumindest ausprobieren, ob dann speziell dieser Fehler verschwindet,
repaint(); müsste danach reichen, bei anderen Layouts als null gehört noch validate(); dazu

-----

allgemein ist streng davon abzuraten, GUI-Komponenten mehrfach zu erzeugen

lagere die beiden Aufrufe
> Vector<?> hwresults = getHardware();
> defaultTableModel.setDataVector(hwresults, hwColumnNames);
in eine Methode fillHwTable() aus, die du vom Button aus sowie einmalig beim Erstellen der HwTable ausführst

dann brauchst du allerdings wieder eine Referenz, ein Klassenattribut fürs Model oder die Tabelle
 

Ähnliche Java Themen


Oben