# ArrayList in andere Klasse übergeben



## Heidi (8. Jul 2010)

Schönen guten Morgen.

Neuer Tag neues Problem mit der ArrayList. Ich möchte gerne die ArrayList aus der Klasse Texteingabe auch in der Klasse GanntDiagrammDarstellung verwenden. Leider darf ich die Getter-Methode mit "static" nicht verwenden, da mir gesagt wird das wäre unsauber, dass man static mehr als einmal benutzt.
Wer auch noch ein paar Tipps zu generellen Struktur hat immer gerne
Strukturierung liegt mir gar nicht.

Vielen dank im voraus für jede Hilfe


```
public class TestBenutzeroberfläche {
	public static void main(String[] args) {
		new Benutzeroberfläche();
	}
}
```


```
public class Vorgang {
	private String name;
	private double anfang;
	private double dauer;

	public Vorgang(String name, double anfang, double dauer) {
		this.name = name;
		this.anfang = anfang;
		this.dauer = dauer;
	}


	public String getName() {
		return name;
	}

	public double getAnfang() {
		return anfang;
	}

	public double getDauer() {
		return dauer;
	}
}
```


```
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class GanttDiagrammDarstellung extends JPanel  {

	public GanttDiagrammDarstellung() {
		super();
	}

	public void zeitunterteilung(Graphics g) {
		for (int i = 1; i < 5; i++) {
			g.drawLine(i * 25, 100, i * 25, 500);
			g.setColor(Color.gray);
		}
	}

	public void paintComponent(Graphics g) {
		zeitunterteilung(g);
	}

}
```


```
import java.util.ArrayList;

import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JTextField;

public class Texteingabe {
	private ArrayList<Vorgang> vorgaenge = new ArrayList<Vorgang>();


	public Texteingabe() {
	}

	public void eingabe(JTextField bezeichnung, JTextField anfang,
			JTextField dauer, DefaultListModel daten, JList auflistung) {
		String name = bezeichnung.getText();
		double a = Double.parseDouble(anfang.getText());
		double d = Double.parseDouble(dauer.getText());
		vorgaenge.add(new Vorgang(name, a, d));
		daten.addElement(name);
	}

	public void bearbeiten(JTextField bezeichnung, JTextField anfang,
			JTextField dauer, DefaultListModel daten, JList auflistung,
			int index) {
		bezeichnung.setText(vorgaenge.get(index).getName());
		anfang.setText("" + vorgaenge.get(index).getAnfang());
		dauer.setText("" + vorgaenge.get(index).getDauer());
		vorgaenge.remove(index);
		daten.remove(index);
	}

	public void entfernen(DefaultListModel daten, JList auflistung, int index) {
		vorgaenge.remove(index);
		daten.remove(index);
	}

}
```


```
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

public class Benutzeroberfläche extends JFrame implements ActionListener,
		MouseListener {
	private DefaultListModel daten = new DefaultListModel();
	private JList auflistung = new JList(daten);
	private JButton hinzufuegen = new JButton("Vorgang hinzufügen");
	private JButton bearbeiten = new JButton("Vorgang bearbeiten");
	private JButton entfernen = new JButton("Vorgang entfernen");

	private JTextField bezeichnung = new JTextField();
	private JTextField anfang = new JTextField();
	private JTextField dauer = new JTextField();
	private JTextField erfüllt = new JTextField();
	private JButton uebernehmen = new JButton("Änderungen übernehmen");
	private JPanel p1, p2, p3, p4, p5, p6, p7,p8;
	private int index;
	Texteingabe t = new Texteingabe();

	public Benutzeroberfläche() {

		JFrame f = new JFrame();
		f.setTitle("Gannt-Diagramm-Editor");
		f.setSize(1050, 650);
		f.setLocationRelativeTo(null);
		f.setVisible(true);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		bezeichnung.enable(false);
		anfang.enable(false);
		dauer.enable(false);
		erfüllt.enable(false);

		// JPanel-Verschachtelung zur Darstellung "Alle Vorgänge"
		p1 = new JPanel(new GridLayout(2, 1, 5, 5));
		p1.setBorder(new TitledBorder("Alle Vorgänge"));
		p1.add(auflistung);

		p2 = new JPanel(new GridLayout(3, 1, 5, 5));
		p2.add(hinzufuegen);
		p2.add(bearbeiten);
		p2.add(entfernen);

		p1.add(p2);

		// JPanel-Verschachtelung zur Darstellung "Vorgangsdaten"
		p3 = new JPanel(new BorderLayout(5, 5));
		p6 = new JPanel(new GridLayout(4, 2, 5, 5));
		p3.setBorder(new TitledBorder("Vorgangsdaten"));
		p6.add(new JLabel("Bezeichnung"));
		p6.add(bezeichnung);
		p6.add(new JLabel("Starttag"));
		p6.add(anfang);
		p6.add(new JLabel("Dauer"));
		p6.add(dauer);
		p6.add(new JLabel("Erfüllt"));
		p6.add(erfüllt);
		p3.add(p6, BorderLayout.CENTER);
		p3.add(uebernehmen, BorderLayout.SOUTH);

		p7 = new JPanel(new GridLayout(1, 1, 5, 5));
		p7.setBorder(new TitledBorder("Projektdaten"));

		p4 = new JPanel(new GridLayout(3, 1));
		p4.add(p1);
		p4.add(p3);
		p4.add(p7);

		// JPanel zur Darstellung des Gantt-Diagramms
		p5 = new JPanel(new GridLayout(1, 1, 10, 10));
		p5.setBorder(new TitledBorder("Diagramm"));
		p8 = new GanttDiagrammDarstellung();
		p5.add(p8);

		f.add(p4, BorderLayout.WEST);
		f.add(p5, BorderLayout.CENTER);

		// ActionListener-Methode den JButtons zuweisen
		hinzufuegen.addActionListener(this);
		uebernehmen.addActionListener(this);
		bearbeiten.addActionListener(this);
		entfernen.addActionListener(this);
		auflistung.addMouseListener(this);

	}

	//mouseClicked-Event zur Bestimmung des angewählten Namens
	public void mouseClicked(MouseEvent e) {
		if (e.getClickCount() == 1) {
			index = auflistung.locationToIndex(e.getPoint());
		}
	}

	public void actionPerformed(ActionEvent ae) {

		if (ae.getSource() == hinzufuegen) {
			bezeichnung.enable(true);
			anfang.enable(true);
			dauer.enable(true);
			erfüllt.enable(true);
		}
		if (ae.getSource() == bearbeiten) {
			bezeichnung.enable(true);
			anfang.enable(true);
			dauer.enable(true);
			erfüllt.enable(true);
			t.bearbeiten(bezeichnung, anfang, dauer, daten, auflistung, index);
		}

		if (ae.getSource() == entfernen) {
			bezeichnung.enable(true);
			anfang.enable(true);
			dauer.enable(true);
			erfüllt.enable(true);
			t.entfernen(daten, auflistung, index);
		}

		if (ae.getSource() == uebernehmen) {
			t.eingabe(bezeichnung, anfang, dauer, daten, auflistung);
			bezeichnung.setText("");
			anfang.setText("");
			dauer.setText("");
			bezeichnung.enable(false);
			anfang.enable(false);
			dauer.enable(false);
			erfüllt.enable(false);
		}
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	}
}
```


----------



## Foermchen82 (8. Jul 2010)

Wo genau ist denn deine static GetterMethode?


----------



## Heidi (8. Jul 2010)

Foermchen82 hat gesagt.:


> Wo genau ist denn deine static GetterMethode?




dei habe ich ja nicht mehr drinnen...ansonsten stünde in der Klasse Texteingabe()

```
private static ArrayList<Vorgang> vorgaenge = new ArrayList<Vorgang>();

...

public static ArrayList<Vorgang> getVorgaenge() { 
return vorgaenge;
}
```
Somit hätte ich weitere 2 static, die unschön sind


----------



## Foermchen82 (8. Jul 2010)

dann mach doch die Getter und die ArrayListe nicht static. Du brauchst sie doch nicht static, oder?


----------



## Heidi (8. Jul 2010)

Foermchen82 hat gesagt.:


> dann mach doch die Getter und die ArrayListe nicht static. Du brauchst sie doch nicht static, oder?




doch muss ich weil sonst Fehlermeldung in der KLasse GanttDiagrammDarstellung() beim aufrufen kommt
"Cannot make a static reference to the non-static method getVorgaenge() from the type Texteingabe"


```
...
public class GanttDiagrammDarstellung extends JPanel {
	ArrayList<Vorgang> a=Texteingabe.getVorgaenge();
...
```


----------



## Eldorado (8. Jul 2010)

Dann wäre eine Möglichkeit der GanttDiagrammDarstellung-Klasse im Konstruktor die Referenz zu dem Objekt der Texteingabe mitzugeben:
Benutzeroberfläche:

```
new GanttDiagrammDarstellung(t);
```
Konstruktor GanttDiagrammDarstellung:

```
public GanttDiagrammDarstellung(Texteingabe texteingabe){
    this.texteingabe = texteinagbe;  //this.texteingabe = Instanzvariable
}
```
und dann kannst du über das Objekt auf den getter zugreifen:

```
texteingabe.getText();
```


----------



## Foermchen82 (8. Jul 2010)

Zwei dinge fallen mir auf:

1.du versucht auf die "Vorgänge" statisch zuzugreifen, was in dem Zusammenhang natürlich falsch ist, Du brauchst hier eine Instanz von "Texteingabe".
2. Ich vermute mal, du lernst grade erst die Programmierung, da du scheinbar den Unterschied zwischen static und non-static nicht kennst.

Zu 2. empfehle ich dir dich erstmal mit einem Mini-Program damit zu beschäftigen, da das die Basics von Java sind.
Zu 1. Du willst scheinbar in deinem Programm die "Texteingabe" nur als singelTon verwenden. Dann schau dir mal das SingelTon-Patern an und die Fortsetzung folgt dann später *g*


----------

