Kommunikation zwsichen Klassen.

Status
Nicht offen für weitere Antworten.

SchachFritz

Aktives Mitglied
Guten Tag,
ich bin neu hier im Forum und komme auch gleich mit einem Problem. Ich habe seit kurzem mein erstes grosses Java-Projekt begonnen.
Ich habe mir eine Datenstruktur zusammengestellt die aus Vectoren und Arrays besteht.
Eine Maske hilft bei der Eingabe der Daten und ein JTable bei der Ausgabe.
Allerdings habe ich dabei ein Problem festgestellt. Woher erkennt das JTable, dass die Daten durch die Maske verändert wurden ?
 
Vielleicht könntest du die genaue Struktur des Programms mal posten - so dass man genau die Zusammenhänge erkennt. Oder falls es an best. Stellen Probleme mit Code gibt, diesen dann posten.
 
Meine Frage war vielleicht nicht besonders gut gestellt.
Ich habe ein JTable das Daten aus einem Vector auslesen soll.
über eine Maske kann der Benutzer daten eingeben, diese werden dann in den Vektor gespeichert.
Ich habe mich bei der JTable mit DefaultTableModel versucht.
Allerdings erkennt das JTable nun nicht wenn die Daten verändern wurden z.B. wenn ein Datensatz gelöscht oder hinzugekommen ist.
Eine Möglichkeit wäre doch eine Update funktion zu schreiben und der Maske eine Referenz auf das Jtable als Parameter anzugeben.
Allerdings glaube ich dass es auch ohne eine Update Methode gehen muss. Kann man nicht einen Listener oder so auf die Daten setzen. Da ich nicht so viel Erfahrung mit java habe, kenne ich mich damit nicht aus. (Bin ja auch noch am lernen)
Ich wäre froh wenn mir da jemand weiterhelfen kann. Besonders was Listener und Interfaces angeht.
Danke im Voraus.
 
Ich habe eine Funktion geschrieben die die Daten aus dem Vektor in ein 2D Array vom Typ Object umwandelt.
(Also Object[][])
Für jede im Klasse im Array habe ich eine toString Methode definiert.
Allerdings verstehe ich das mit dem DefaultTableModel nicht so richtig.
Momentan habe ich es so programmiert, dass das JTable über eine Methode Update verfügt.
Die Klasse der Maske bekommt eine Referenz auf das JTable und ruft dann die Methode Update() wenn die Daten geändert wurden.
Allerdings muss es doch auch einen andere Möglichkeit geben. So dass das Jtable von selbem merkt wann die Daten geändert wurden. Kann dies nicht mit einem Listener berwerkstelligen ?
 
Mein Code der DatenStruktur :
Code:
public class DB {
		
	private Vector database;
	public DB() { database = new Vector();}
	
	public void addDataSet(DataSet element) 
	{database.addElement(element); }
	
	public DataSet getDataSet(int index)
	{ 	try {return (DataSet) database.get(index);} 
		catch(Exception ex){System.out.println("Element dont exist."); return null;}
	}
	
	public int Length(){return database.size();}
	
	public void delDataSet(int index) 
	{
	 try{
		database.remove(index);}
	 catch ( Exception ex) { System.out.println("Data set dont exist.");}
	}
	
	public void Replace(DataSet data, int index) 
	{try{ database.setElementAt(data,index);
	}
	catch(Exception Ex) { System.out.println("Data set dont exist.");}
	}
	
	public String[] Categories()
	{ 
		Vector echo = new Vector();
		Enumeration enum = database.elements();
	    while (enum.hasMoreElements()) 
	    {
	    	DataSet Data = (DataSet) enum.nextElement();
	    	if (echo.contains(Data.Category)!=true) echo.addElement(Data.Category); 
	  	
	    }		
		enum = echo.elements();
		String[] cat = new String[echo.size()+1]; 
		for (int i=0;enum.hasMoreElements();i++) cat[i] =(String) enum.nextElement();
		cat[echo.size()] = "default"; 
		return cat;
	}
	
	public Object[][] MakeArray()
	{
		Object[][] echo = new Object[this.Length()][8];
		Enumeration enum = this.database.elements();
		SimpleDateFormat format = new SimpleDateFormat("dd.MM.yyyy");
		for (int loop=0;enum.hasMoreElements();loop++) 
		{
			DataSet data  = (DataSet) enum.nextElement();
			echo[loop][0] = data.Name;
			echo[loop][1] = data.Description;
			echo[loop][2] = data.Category;
			echo[loop][3] = data.State;
			echo[loop][4] = format.format(data.Creation);			
			echo[loop][5] = format.format(data.Limit);
			echo[loop][6] = format.format(data.Resolution);
			echo[loop][7] = format.format(data.LastModified); 
		}
		return echo;		
	}
	    
		
	
	   
	   
		 
	
	
	

}

Nun der Code des JTable : 
public class myScrollTable extends JScrollPane{
	private InputMask Mask;
	private DB Database;
	private String[] ColumnNames = {"Name : ","Description :","Category :","State :","Creation : ","Limit : ","Resolution : "}; 
	private JTable jTable;
	private DefaultTableModel myModel;
	
	
	public myScrollTable(DB Database,InputMask Mask) {
		super();
		this.Database = Database;
		this.Mask = Mask;
		initialize();
	}
	
	private  void initialize() {
		this.setPreferredSize(new java.awt.Dimension(800,200));
		this.setViewportView(getJTable());
		this.setSize(800, 200);
	}
	  
	private JTable getJTable() {
		if (jTable == null) {
			
			myModel = new DefaultTableModel(Database.MakeArray(),ColumnNames);
			
			jTable = new JTable( myModel);
			
			
			jTable.addMouseListener(new java.awt.event.MouseAdapter() { 
				public void mouseClicked(java.awt.event.MouseEvent e) { 
					Point p = e.getPoint();
					int row = jTable.rowAtPoint(p);
					Mask.Ubdate(row);
					
					
				}
			});
		}
		return jTable;
	}
	
	public void Ubdate(int ID)
	{
		myModel = new DefaultTableModel(Database.MakeArray(),ColumnNames);
		jTable.setModel(myModel);
		
		
	}

Edit Illuvatar: Codetags!
 
SchachFritz hat gesagt.:
Ich habe mich bei der JTable mit DefaultTableModel versucht.
Allerdings erkennt das JTable nun nicht wenn die Daten verändern wurden z.B. wenn ein Datensatz gelöscht oder hinzugekommen ist.
Mit dem DefaultTableModel solltest du eigentlich keine Probleme haben.
Wie änderst du denn die Daten in der Table? Es ist wichtig das du nicht direkt über die Tabelle gehst,
sondern wirklich nur mit dem Model arbeitest. Dann sollte die Table sich eigentlich auch updaten!
 
Da ich mich damit nicht so gut auskenne, erzeuge ich ein neues DefaultTableModel mit den neuen Werten.

Ich kann noch den Code der Eingabemaske angeben :


package manager;

import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JInternalFrame;

import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;

import java.util.Date;

public class InputMask extends JPanel{

private DB Database;
private int ID;
private JLabel jLabel = null;
private JLabel jLabel1 = null;
private JLabel jLabel2 = null;
private JLabel jLabel3 = null;
private JLabel jLabel4 = null;
private JLabel jLabel5 = null;
private JLabel jLabel6 = null;
private ComboBox edtCat = null;
private JTextField edtName = null;
private JTextField edtDescription = null;
private JTextField edtState = null;
private DateEdit edtCreationDate = null;
private DateEdit edtLimitDate = null;
private DateEdit edtResolutionDate = null;
private JLabel jLabel7 = null;
private JPanel jContentPane = null;
private JInternalFrame jInternalFrame = null;
private ComboBox getEdtCat() {
if (edtCat == null) {

edtCat = new ComboBox(Database.Categories(),"default");
}
return edtCat;
}

private JTextField getEdtName() {
if (edtName == null) {
edtName = new JTextField();
}
return edtName;
}

private JTextField getEdtDescription() {
if (edtDescription == null) {
edtDescription = new JTextField();
}
return edtDescription;
}

private JTextField getEdtState() {
if (edtState == null) {
edtState = new JTextField();
}
return edtState;
}

private DateEdit getEdtCreationDate() {
if (edtCreationDate == null) {
edtCreationDate = new DateEdit();
}
return edtCreationDate;
}

private DateEdit getEdtLimitDate() {
if (edtLimitDate == null) {
edtLimitDate = new DateEdit();
}
return edtLimitDate;
}

private DateEdit getEdtResolutionDate() {
if (edtResolutionDate == null) {
edtResolutionDate = new DateEdit();
}
return edtResolutionDate;
}

private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new JPanel();
jContentPane.setLayout(new BorderLayout());
}
return jContentPane;
}

private JInternalFrame getJInternalFrame() {
if (jInternalFrame == null) {
jInternalFrame = new JInternalFrame();
jInternalFrame.setContentPane(getJContentPane());
}
return jInternalFrame;
}

public InputMask( DB Database, int ID) {
super();

this.Database = Database;
this.ID = ID;
initialize();
}

private void initialize() {

jLabel7 = new JLabel();
jLabel6 = new JLabel();
jLabel5 = new JLabel();
jLabel4 = new JLabel();
jLabel3 = new JLabel();
jLabel2 = new JLabel();
jLabel1 = new JLabel();
jLabel = new JLabel();
GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
GridBagConstraints gridBagConstraints7 = new GridBagConstraints();
GridBagConstraints gridBagConstraints8 = new GridBagConstraints();
GridBagConstraints gridBagConstraints9 = new GridBagConstraints();
GridBagConstraints gridBagConstraints10 = new GridBagConstraints();
GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
GridBagConstraints gridBagConstraints12 = new GridBagConstraints();
GridBagConstraints gridBagConstraints13 = new GridBagConstraints();
GridBagConstraints gridBagConstraints14 = new GridBagConstraints();
GridBagConstraints gridBagConstraints15 = new GridBagConstraints();
GridBagConstraints gridBagConstraints16 = new GridBagConstraints();
GridBagConstraints gridBagConstraints18 = new GridBagConstraints();
GridBagConstraints gridBagConstraints17 = new GridBagConstraints();
this.setLayout(new GridBagLayout());
this.setSize(657, 278);
gridBagConstraints1.gridx = 0;
gridBagConstraints1.gridy = 2;
jLabel.setText("Name :");
jLabel.setPreferredSize(new java.awt.Dimension(115,16));
jLabel.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
gridBagConstraints2.gridx = 0;
gridBagConstraints2.gridy = 5;
jLabel1.setText("Description :");
jLabel1.setPreferredSize(new java.awt.Dimension(115,60));
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
gridBagConstraints3.gridx = 0;
gridBagConstraints3.gridy = 3;
jLabel2.setText("State :");
jLabel2.setPreferredSize(new java.awt.Dimension(115,30));
jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
gridBagConstraints4.gridx = 0;
gridBagConstraints4.gridy = 1;
jLabel3.setText("Categorie :");
jLabel3.setPreferredSize(new java.awt.Dimension(200,60));
jLabel3.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
gridBagConstraints5.gridx = 0;
gridBagConstraints5.gridy = 7;
jLabel4.setText("Creation date :");
jLabel4.setPreferredSize(new java.awt.Dimension(115,30));
jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
jLabel5.setText("Limit for resolution :");
jLabel5.setPreferredSize(new java.awt.Dimension(115,30));
jLabel5.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
gridBagConstraints7.gridx = 2;
gridBagConstraints7.gridy = 7;
jLabel6.setText("Resolution date :");
jLabel6.setPreferredSize(new java.awt.Dimension(115,30));
jLabel6.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
gridBagConstraints8.gridx = 1;
gridBagConstraints8.gridy = 1;
gridBagConstraints8.weightx = 1.0;
gridBagConstraints8.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints9.gridx = 1;
gridBagConstraints9.gridy = 2;
gridBagConstraints9.weightx = 1.0;
gridBagConstraints9.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints10.gridx = 1;
gridBagConstraints10.gridy = 5;
gridBagConstraints10.weightx = 1.0;
gridBagConstraints10.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints10.gridwidth = 3;
gridBagConstraints11.gridx = 1;
gridBagConstraints11.gridy = 3;
gridBagConstraints11.weightx = 1.0;
gridBagConstraints11.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints12.gridx = 0;
gridBagConstraints12.gridy = 9;
gridBagConstraints13.gridx = 1;
gridBagConstraints13.gridy = 9;
gridBagConstraints14.gridx = 2;
gridBagConstraints14.gridy = 9;
gridBagConstraints15.gridx = 0;
gridBagConstraints15.gridy = 0;
gridBagConstraints16.gridx = 1;
gridBagConstraints16.gridy = 0;

gridBagConstraints17.gridx = 1;
gridBagConstraints17.gridy = 12;
gridBagConstraints18.gridx = 1;
gridBagConstraints18.gridy = 7;
this.add(jLabel, gridBagConstraints1);
this.add(jLabel1, gridBagConstraints2);
this.add(jLabel2, gridBagConstraints3);
this.add(jLabel3, gridBagConstraints4);
this.add(jLabel4, gridBagConstraints5);
this.add(jLabel6, gridBagConstraints7);
this.add(getEdtCat(), gridBagConstraints8);
this.add(getEdtName(), gridBagConstraints9);
this.add(getEdtDescription(), gridBagConstraints10);
this.add(getEdtState(), gridBagConstraints11);
this.add(getEdtCreationDate(), gridBagConstraints12);
this.add(getEdtLimitDate(), gridBagConstraints13);
this.add(getEdtResolutionDate(), gridBagConstraints14);

this.add(getJInternalFrame(), gridBagConstraints17);
this.add(jLabel7, gridBagConstraints15);
this.add(jLabel5, gridBagConstraints18);
}

public void Ubdate(int ID)
{
this.ID = ID;
DataSet Data = Database.getDataSet(ID);
this.edtDescription.setText(Data.Description);
this.edtCat.Update(Database.Categories(),Data.Category);
this.edtName.setText(Data.Name);
this.edtState.setText(Data.State);

this.edtLimitDate.setDate(Data.Limit);
this.edtCreationDate.setDate(Data.Creation);
this.edtResolutionDate.setDate(Data.Resolution);
}

public void Save()
{
DataSet data = new DataSet();

data.Name = edtName.getText();
data.Description = edtDescription.getText();
data.State = this.edtState.getText();

data.Category = this.edtCat.getCategory();

data.Creation = this.edtCreationDate.getDate();
data.Resolution = this.edtResolutionDate.getDate();
data.Limit = this.edtLimitDate.getDate();

data.LastModified = new Date();

Database.addDataSet(data);
}

public void Delete() { Database.delDataSet(ID);}
public void Modify()
{
DataSet data = new DataSet();

data.Name = edtName.getText();
data.Description = edtDescription.getText();
data.State = this.edtState.getText();

data.Category = this.edtCat.getCategory();

data.Creation = this.edtCreationDate.getDate();
data.Resolution = this.edtResolutionDate.getDate();
data.Limit = this.edtLimitDate.getDate();

data.LastModified = new Date();

Database.Replace(data,ID);

}

public void Clear()
{
this.edtDescription.setText("");
this.edtName.setText("");
this.edtState.setText("");
this.edtCat.Update(Database.Categories(),"default");


}


}
 
Mach da bitte mal Code-Tags rein!
Warum erstellst du jedesmal ein komplett neues Model? Welche Daten sind da drin? Ändern die sich jedes mal komplett oder werden nur Werte geändert?
 
Es können Datensätze hinzugefügt, geändert und gelöscht werden.
Ich erstelle momentan ein komplett neues Model, da ich mit nicht anders zu helfen wusste. Bin eben noch Anfänger was Java angeht.

Mein Hauptproblem liegt darin, dass ich mit DefaultModelTable noch nicht so richtig umzugehen weiss.
 
Das DefaultTableModel lässt sich sehr bequem handhaben.
Einfach in der API nachlesen was es alles kann.
Normalerweise verändert man einzelne Werte mit setValueAt() oder anderen set-Methoden.
In keinem Fall für jede Änderung ein neues Model erstellen!!!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben