Probleme mit Graphics

Heidi

Mitglied
Schönen guten Morgen.

So neuer Tag neues Problem mit Java. Wenn man nur 2,5 Monate in der Uni ein wenig die Grundagen lernt kommt man irgendwie ohne Hilfe kaum weiter.

Momentan habe ich Probleme bei der Grafikausgabe meines Gantt-Diagramms. Und zwar will ich bei jeder neuen Eingabe die Balkendarstellung(momentan nur provisorisch von der Anordnung) erneuern. Leider funktioniert das überhaupt nicht wie ich das gerne hätte.

Und zwar wenn iich meine ersten Werte übergebe, wil ich über "p5.remove(p8)" meine alte Darstellung entfernen und eine neue danach initialisieren. Aber es scheint als würde mir dann noch einmal die gesamte oberfläche in dieses panel geschrieben. leider sehe ich nicht voran es liegt.

Vielen Dank für jegliche Hilfen und verbesserungsvorschläge.

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

Java:
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 java.util.ArrayList;

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;
	private ArrayList<Vorgang> vorgaenge = new ArrayList<Vorgang>();

	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(vorgaenge);
		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);
			bezeichnung.setText(vorgaenge.get(index).getName());
			anfang.setText("" + vorgaenge.get(index).getAnfang());
			dauer.setText("" + vorgaenge.get(index).getDauer());
			vorgaenge.remove(index);
			daten.remove(index);
		}

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

		if (ae.getSource() == uebernehmen) {
			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);
			//Eingabefelder leeren 
			bezeichnung.setText("");
			anfang.setText("");
			dauer.setText("");
			//Eingabefelder "ausschalten"
			bezeichnung.enable(false);
			anfang.enable(false);
			dauer.enable(false);
			erfüllt.enable(false);
			//Gannt-Diagramm erneuern
			p5.remove(p8);
			p8 = new GanttDiagrammDarstellung(vorgaenge);
			p5.add(p8);

		}
	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
	}

	public void mouseReleased(MouseEvent e) {
	}
}

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JComponent;
import javax.swing.JPanel;

public class GanttDiagrammDarstellung extends JPanel {
	

	private ArrayList<Vorgang> vorgaenge;

	public GanttDiagrammDarstellung(ArrayList<Vorgang> vorgaenge) {
		super();
		this.vorgaenge=vorgaenge;
	}

	// Verwendung von Boxen zur grafischen Darstellung der Bauabläufe
	public void balkenDarstellung(Graphics g) {
		for (int i = 0; i < vorgaenge.size(); i++) {
			g.setColor(Color.red);
			g.drawRect(70, 100 + 50 * i, 50, 15);
			g.fillRect(70, 100 + 50 * i, 50, 15);
		}
	}

	 // Beschriftung der Balken
	 public void beschriftung(Graphics g) {
	 for (int i = 0; i < vorgaenge.size(); i++) {

	 }
	 }
	
	 //Grafische Darstellung der Zeitunterteilung
	public void zeitunterteilung(Graphics g) {
		for (int i = 0; i < vorgaenge.size(); i++) {
			g.drawLine(70+i * 25, 100, 70+i * 25, 500);
			g.setColor(Color.gray);
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponents(g);
		zeitunterteilung(g);
		balkenDarstellung(g);
		beschriftung(g);
	}

}

Java:
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;
	}
}
 
Hallo,

meiner Meinung nach liegt der Fehler darin, dass Du
Code:
Benutzeroberfläche
von
Code:
JFrame
ableitest, dann aber wieder eine lokale Variable vom Type
Code:
JFrame
deklarierst, um die Oberfläche zu gestalten. Mit folgenden Änderungen funktioniert Dein Programm bei mir:

Java:
//[...]
public Benutzeroberfläche() {

		this.setTitle("Gannt-Diagramm-Editor");
		this.setSize(1050, 650);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//[...]
      this.add(p4, BorderLayout.WEST);
		this.add(p5, BorderLayout.CENTER);
//[...]

Grüße
 
Statt bei jeder Änderung ein neues Objekt von GanttDiagrammDarstellung zu erstellen, solltest Du in der Klasse eine Methode setVorgeange(ArrayList<Vorgang> vorgaenge), welche die Referenzvariable auf die neuen "Vorgänge" setzt und eventuell ein repaint anfordert.
Java:
public void setVorgeange(ArrayList<Vorgang> vorgaenge) {
    this.vorgaenge = vorgaenge;
    this.repaint();
}
Diese Methode rufst Du dann im ActionListener Deiner Hauptklasse auf.

Was mir in der Klasse noch auffällt:
[JAVA=42] public void paintComponent(Graphics g) {
super.paintComponents(g);[/code]
das sollte super.paintComponent(g) ohne s heissen.
 

Zurück
Oben