Diverse Dinge: Unstabile Grafik, Druckt Grafik nicht,Tooltipp verschwindet hinter Grafik

Status
Nicht offen für weitere Antworten.

Heidi

Mitglied
Schönen guten Abend.

Muss morgen mein Java-Projekt einreichen und wollte noch ein paar kleine Schönheitsfehler korrigieren.

1) Tooltipps der Eingabefelder verschwinden hinter dem ViewerPanel (ab der 2.Eingabe meist nicht mehr)
2) Damit fängt dann aber das Problem der "unstabilen" Grafik an und es flakert oder muss erst nocheinmal auf die Grafik klicken damit ich sie wieder sehe
3) Nach der ersten Eingabe wird der linke Bereich verschmallert und die Ansicht der Grafik wird breiter(hätte das eigentlich gerne konstant:()
4) Über meine Druckfunktion (nicht sehr ausgereift) werden alle buttons etc. ausgedruckt nur die grafik bleibt grau (kann ich dieses ViewerPanel überhaupt so leicht ausdrucken)

ürsprünglich hatte ich ich extra mit der graphics funktion von java auseinandergesetzt aber diese wollte mein professor leider nicht sehen. deshalb musste ich dieses viewerpanel einfügen

vielleicht hat ja einer zeit sich das ganze mal anzuschauen und den ein oder anderen markel zu verbessern

bitte nicht zu viel über struktur und aufbau und verknüpfung meckern...ich mache java erst seit ende april

schon mal vielen dank für jegliche mühen

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

Java:
import inf.v3d.view.ViewerPanel;

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.PrintJob;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

/**
 * Diese Klasse erzeugt die grafische Oberfläche.
 */
public class Benutzeroberfläche extends JFrame implements ActionListener {
	private DefaultListModel daten = new DefaultListModel();
	private JList auflistung = new JList(daten);
	private JButton buttonHinzufuegen = new JButton("Vorgang hinzufügen");
	private JButton buttonBearbeiten = new JButton("Vorgang bearbeiten");
	private JButton buttonEntfernen = new JButton("Vorgang entfernen");
	private JButton buttonUebernehmen = new JButton("Änderungen übernehmen");
	private JTextField textfeldBezeichnung = new JTextField();
	private JTextField textfeldAnfang = new JTextField();
	private JTextField textfeldDauer = new JTextField();
	private JTextField textfeldErfüllt = new JTextField();
	private JPanel panelAlleVorgaenge, p2, panelVorgangsdaten,
			panelEingabebereich, panelGanttDiagramm, p6, panelProjektdaten;
	private ViewerPanel viewer = new MeinViewerPanel();
	private int index;
	private ArrayList<Vorgang> vorgaenge = new ArrayList<Vorgang>();
	private JMenuBar menueLeiste = new JMenuBar();
	private JMenu datei = new JMenu("Datei");
	private JMenuItem menuepunktNeu = new JMenuItem("Neu");
	private JMenuItem menuepunktLaden = new JMenuItem("Laden");
	private JMenuItem menuepunktSpeichern = new JMenuItem("Speichern");
	private JMenuItem menuepunktDrucken = new JMenuItem("Drucken");
	private JLabel ausgabeProjektdaten = new JLabel();

	public Benutzeroberfläche() {

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

		new HinweiseBenutzereingabe(textfeldAnfang, textfeldBezeichnung,
				textfeldDauer, textfeldErfüllt);
		// Starteinstellungen der GUI-Oberfläche
		ausschaltenEinagbefelder();

		// Menüelemente und Untermenüelemante hinzufügen
		menueLeiste.add(datei);
		datei.add(menuepunktNeu);
		datei.add(menuepunktLaden);
		datei.add(menuepunktSpeichern);
		datei.add(menuepunktDrucken);

		// JPanel-Verschachtelung zur Darstellung "Alle Vorgänge"
		panelAlleVorgaenge = new JPanel(new GridLayout(2, 1, 5, 5));
		panelAlleVorgaenge.setBorder(new TitledBorder("Alle Vorgänge"));
		panelAlleVorgaenge.add(new JScrollPane(auflistung));
		p2 = new JPanel(new GridLayout(3, 1, 5, 5));
		p2.add(buttonHinzufuegen);
		p2.add(buttonBearbeiten);
		p2.add(buttonEntfernen);
		panelAlleVorgaenge.add(p2);

		// JPanel-Verschachtelung zur Darstellung "Vorgangsdaten"
		panelVorgangsdaten = new JPanel(new BorderLayout(5, 5));
		p6 = new JPanel(new GridLayout(4, 2, 5, 5));
		panelVorgangsdaten.setBorder(new TitledBorder("Vorgangsdaten"));
		p6.add(new JLabel("Bezeichnung"));
		p6.add(textfeldBezeichnung);
		p6.add(new JLabel("Starttag"));
		p6.add(textfeldAnfang);
		p6.add(new JLabel("Dauer"));
		p6.add(textfeldDauer);
		p6.add(new JLabel("Erfüllt"));
		p6.add(textfeldErfüllt);
		panelVorgangsdaten.add(p6, BorderLayout.CENTER);
		panelVorgangsdaten.add(buttonUebernehmen, BorderLayout.SOUTH);

		// JPanel-Verschachtelung zur Darstellung "Projektdaten"
		panelProjektdaten = new JPanel(new GridLayout(1, 1, 5, 5));
		panelProjektdaten.setBorder(new TitledBorder("Projektdaten"));
		panelProjektdaten.add(ausgabeProjektdaten);

		// Zusammenfügen der Panels zum Einagbe- und Datenbereich
		panelEingabebereich = new JPanel(new GridLayout(3, 1));
		panelEingabebereich.add(panelAlleVorgaenge);
		panelEingabebereich.add(panelVorgangsdaten);
		panelEingabebereich.add(panelProjektdaten);

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

		// Einfügen der einzelnen Panels in den Frame
		this.add(panelEingabebereich, BorderLayout.WEST);
		this.add(panelGanttDiagramm, BorderLayout.CENTER);
		this.add(menueLeiste, BorderLayout.NORTH);

		// ActionListener-Methode den JButtons zuweisen
		buttonUebernehmen.addActionListener(this);
		buttonBearbeiten.addActionListener(this);
		buttonHinzufuegen.addActionListener(this);
		buttonEntfernen.addActionListener(this);
		menuepunktSpeichern.addActionListener(this);
		menuepunktLaden.addActionListener(this);
		menuepunktDrucken.addActionListener(this);
		menuepunktNeu.addActionListener(this);

	}

	public void actionPerformed(ActionEvent ae) {

		if (ae.getSource() == buttonHinzufuegen) {
			einschaltenEingabefelder();
		}
		if (ae.getSource() == buttonBearbeiten) {
			index = auflistung.getSelectedIndex();
			einschaltenEingabefelder();
			textfeldBezeichnung.setText(vorgaenge.get(index).getName());
			textfeldAnfang.setText("" + vorgaenge.get(index).getAnfang());
			textfeldDauer.setText("" + vorgaenge.get(index).getDauer());
			textfeldErfüllt.setText("" + vorgaenge.get(index).getErfüllt());
			vorgaenge.remove(index);
			daten.remove(index);
			zeichne();
		}

		if (ae.getSource() == buttonEntfernen) {
			index = auflistung.getSelectedIndex();
			HilfsberechnungProjektdaten h = new HilfsberechnungProjektdaten(
					vorgaenge);
			einschaltenEingabefelder();
			vorgaenge.remove(index);
			daten.remove(index);
			String html = ("<html><h1>Anzahl</h1> Vorgänge: "
					+ vorgaenge.size() + "<br>Gesamtdauer: " + h.bauzeit()
					+ " Tage<br>Erfüllungsgrad: " + h.erfuellunsgrad() + "%</html>");
			ausgabeProjektdaten.setText(html);
			zeichne();
		}

		if (ae.getSource() == buttonUebernehmen) {
			HilfsberechnungProjektdaten h = new HilfsberechnungProjektdaten(
					vorgaenge);
			String name = textfeldBezeichnung.getText();
			int a = Integer.parseInt(textfeldAnfang.getText());
			int d = Integer.parseInt(textfeldDauer.getText());
			double e = Double.parseDouble(textfeldErfüllt.getText());
			vorgaenge.add(new Vorgang(name, a, d, e));
			daten.addElement(name);
			// Eingabefelder leeren
			textfeldBezeichnung.setText("");
			textfeldAnfang.setText("");
			textfeldDauer.setText("");
			textfeldErfüllt.setText("");
			String html = ("<html>Anzahl Vorgänge: " + vorgaenge.size()
					+ "<br>Gesamtdauer: " + h.bauzeit()
					+ " Tage<br>Erfüllungsgrad: " + h.erfuellunsgrad() + "%</html>");
			ausgabeProjektdaten.setText(html);
			// Eingabefelder "ausschalten"
			ausschaltenEinagbefelder();
			// Grafische Darstellung des Gantt-Diagramms
			zeichne();
		}

		if (ae.getSource() == menuepunktSpeichern) {
			FileDialog fd = new FileDialog(this, "Datei auswählen",
					FileDialog.SAVE);
			fd.setVisible(true);
			String dateiname = fd.getDirectory() + fd.getFile() + ".csv";
			System.out.println(dateiname);
			new DatenSpeichern(vorgaenge, dateiname);
		}

		if (ae.getSource() == menuepunktLaden) {
			FileDialog fd = new FileDialog(this, "Datei auswählen",
					FileDialog.LOAD);
			fd.setVisible(true);
			String dateiname = fd.getDirectory() + "/" + fd.getFile();
			new DatenLaden(vorgaenge, dateiname);
			zeichne();
			for (Vorgang v : vorgaenge) {
				daten.addElement(v.getName());
			}
		}
		if (ae.getSource() == menuepunktDrucken) {
			Toolkit tk = Toolkit.getDefaultToolkit();
			PrintJob pj = tk.getPrintJob(this, "", null);
			if (pj != null) {
				Graphics g = pj.getGraphics();
				this.printComponents(g);
				g.dispose();
				pj.end();
			}
		}

		if (ae.getSource() == menuepunktNeu) {
			vorgaenge.removeAll(vorgaenge);
			daten.removeAllElements();
			ausschaltenEinagbefelder();
			ausgabeProjektdaten.setText("");
			zeichne();
		}
	}

	public void einschaltenEingabefelder() {
		textfeldBezeichnung.enable(true);
		textfeldAnfang.enable(true);
		textfeldDauer.enable(true);
		textfeldErfüllt.enable(true);
		buttonUebernehmen.enable(true);
	}

	public void ausschaltenEinagbefelder() {
		textfeldBezeichnung.enable(false);
		textfeldAnfang.enable(false);
		textfeldDauer.enable(false);
		textfeldErfüllt.enable(false);
		buttonUebernehmen.enable(false);
	}

	public void zeichne() {
		GanttDiagramm g = new GanttDiagramm(vorgaenge);
		g.zeichne(viewer);
	}

}


Java:
import inf.v3d.obj.Box;
import inf.v3d.obj.Line;
import inf.v3d.obj.Text;
import inf.v3d.view.ViewerPanel;

import java.util.ArrayList;

public class GanttDiagramm {
	private ArrayList<Vorgang> vorgaenge;
	private int gesamtdauer;

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

	public void zeichne(ViewerPanel v) {
		v.clear();
		zeitunterteilung(v);
		balkenDarstellung(v);
		beschriftung(v);
		v.resetView();
		v.render();
	}

	public void zählerFürDauer() {
		gesamtdauer = 0;
		for (int i = 0; i < vorgaenge.size(); i++) {
			if (vorgaenge.get(i).getAnfang() + vorgaenge.get(i).getDauer() > gesamtdauer) {
				gesamtdauer = (int) (vorgaenge.get(i).getAnfang() + vorgaenge
						.get(i).getDauer());
			}
		}
	}

	public void balkenDarstellung(ViewerPanel viewer) {
		for (Vorgang v : vorgaenge) {
			Box b = new Box(v.getAnfang(), -vorgaenge.indexOf(v), 0);
			b.setSize(v.getDauer(), .3, 0);
			b.setColor("red");
			viewer.addObject3D(b);

			Box b2 = new Box(v.getAnfang(), -vorgaenge.indexOf(v), 0);
			b2.setSize(v.getDauer() * v.getErfüllt() / 100, .3, 0);
			b2.setColor("green");
			viewer.addObject3D(b2);
		}
	}

	public void beschriftung(ViewerPanel viewer) {
		for (Vorgang v : vorgaenge) {
			Text t = new Text(-5, -vorgaenge.indexOf(v), 0, .3, v.getName());
			t.setColor("black");
			viewer.addObject3D(t);
		}
	}

	public void zeitunterteilung(ViewerPanel viewer) {
		zählerFürDauer();
		for (int i = 0; i < gesamtdauer; i++) {
			Line l = new Line(i, 1, 0, i, -(vorgaenge.size() - .5), 0);
			l.setLinewidth(1);
			l.setColor("gray");
			viewer.addObject3D(l);
			if (i % 5 == 0) {
				{
					String str = "" + i;
					Text t = new Text(i - 0.2, 1.2, 0, 0.3, str);
					t.setColor("gray");
					viewer.addObject3D(t);
				}
			}
		}
	}
}

Java:
import javax.swing.JTextField;
import javax.swing.ToolTipManager;

public class HinweiseBenutzereingabe {

	public HinweiseBenutzereingabe(JTextField textfeldAnfang,
			JTextField textfeldBezeichnung, JTextField textfeldDauer,
			JTextField textfeldErfüllt) {

		// Tooltipps für die Eingabewerte durch den Benutzer
		ToolTipManager.sharedInstance().setInitialDelay(100);
		textfeldBezeichnung
				.setToolTipText("<html>Geben Sie hier den Namen ihres Vorgangs ein.<br>Benutzen Sie bitte Werte größer 0!</html>");
		textfeldAnfang
				.setToolTipText("<html>Geben Sie hier den Starttag ihres Vorgangs ein.<br>Benutzen Sie bitte Werte größer 0!</html>");
		textfeldDauer
				.setToolTipText("<html>Geben Sie hier die Dauer ihres Vorgangs ein.<br>Benutzen Sie bitte Werte größer 0!</html>");
		textfeldErfüllt
				.setToolTipText("<html>Geben Sie hier den Erfüllungsgrades ihres Vorgangs ein.<br>Benutzen Sie bitte Werte zwischen 0 und 100!</html>");

	}

}

Java:
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.ArrayList;

public class DatenSpeichern {

	public DatenSpeichern(ArrayList<Vorgang> vorgaenge, String dateiname) {

		try {
			FileWriter fw = new FileWriter(dateiname);
			PrintWriter out = new PrintWriter(fw);
			out.println(vorgaenge.size());
			for (Vorgang v : vorgaenge)
				out.println(v.getName() + ";" + v.getAnfang() + ";"
						+ v.getDauer() + ";" + v.getErfüllt());
			out.close();
			fw.close();
		} catch (Exception e) {
			System.out.println("Fehler beim Schreiben!");
		}
	}
}

Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;

public class DatenLaden {

	public DatenLaden(ArrayList<Vorgang> vorgaenge, String dateiname) {
		try {
			FileReader fr = new FileReader(dateiname);
			BufferedReader in = new BufferedReader(fr);
			int n = Integer.parseInt(in.readLine());
			for (int i = 0; i < n; i++) {
				String zeile = in.readLine();
				String[] s = zeile.split(";");
				String bezeichnung = s[0];
				int anfang = Integer.parseInt(s[1]);
				int dauer = Integer.parseInt(s[2]);
				double erfüllt = Double.parseDouble(s[3]);
				Vorgang v = new Vorgang(bezeichnung, anfang, dauer, erfüllt);
				vorgaenge.add(v);
			}
		} catch (Exception e) {
			System.out.println("Fehler beim Laden!");
		}
	}
}

Java:
public class Vorgang {
	private String name;
	private int anfang;
	private int dauer;
	private double erfüllt;

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

	public String getName() {
		return name;
	}

	public int getAnfang() {
		return anfang;
	}

	public int getDauer() {
		return dauer;
	}

	public double getErfüllt() {
		return erfüllt;
	}
}

Java:
import inf.v3d.obj.Object3D;
import inf.v3d.view.Registry;
import inf.v3d.view.ViewerPanel;
import java.util.ArrayList;

/**
 * Erweitertes ViewerPanel, das nun auch das korrekte hinzufügen und löschen von
 * Objekten erlaubt.
 */
public class MeinViewerPanel extends ViewerPanel {

	/**
	 * die Seriennummer dieses Klasse (wird nicht verwendet).
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * eine Liste mit allen 3D-Objekte, die zu diesem MeinViewerPanel
	 * hinzugefügt wurden.
	 */
	private ArrayList<Object3D> objekte = new ArrayList<Object3D>();

	/**
	 * Löscht alle 3D-Objekte aus dieser Ansicht.
	 */
	public void clear() {
		for (Object3D o : objekte) {
			Registry.instance().unregister(o);
		}
		objekte.clear();
		super.clear();
	}

	/**
	 * Fügt ein neues 3D-Objekt zu dieser Ansicht hinzu.
	 * 
	 * @param o
	 *            das Objekt, das hinzugefügt werden soll
	 */
	public void addObject3D(Object3D o) {
		super.addObject3D(o);
		objekte.add(o);
	}
}

Java:
import java.util.ArrayList;

public class HilfsberechnungProjektdaten {
	private ArrayList<Vorgang> vorgaenge;

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

	public double erfuellunsgrad() {
		double zahl = 0;
		double summeErfuellteTage = 0;
		double summeAlleTage = 0;
		for (Vorgang v : vorgaenge) {
			summeErfuellteTage = summeErfuellteTage + v.getErfüllt()
					* v.getDauer() / 100;
			summeAlleTage = summeAlleTage + v.getDauer();
		}
		zahl = (summeErfuellteTage / summeAlleTage) * 100;
		double erfuellunsgrad = Math.round(zahl * 100) / 100;
		return erfuellunsgrad;
	}

	public int bauzeit() {
		int bauzeit = 0;
		int gesamtdauer = 0;
		int lücke = 0;
		int starttag = vorgaenge.get(0).getAnfang();
		for (int i = 0; i < vorgaenge.size(); i++) {
			if (vorgaenge.get(i).getAnfang() + vorgaenge.get(i).getDauer() > gesamtdauer) {
				gesamtdauer = (int) (vorgaenge.get(i).getAnfang() + vorgaenge
						.get(i).getDauer());
				if (starttag > vorgaenge.get(i).getAnfang()) {
					starttag = vorgaenge.get(i).getAnfang();
				}
			}
		}
		for (int i = 0; i < vorgaenge.size() - 1; i++) {
			if (vorgaenge.get(i).getAnfang() + vorgaenge.get(i).getDauer() < vorgaenge
					.get(i + 1).getAnfang()) {
				lücke = lücke + vorgaenge.get(i + 1).getAnfang()
						- vorgaenge.get(i).getAnfang()
						- vorgaenge.get(i).getDauer();
			}
		}
		bauzeit = gesamtdauer - starttag - lücke;
		return bauzeit;
	}
}
 
A

anonym

Gast
Ich sehe mal in die magische Kristallkugel und stelle fest, dass du an der Ruhruni Bochum bist. ViewerPanel ist nämlich eine Klasse aus einer Grafikbibliotheke, die eine Eigenentwicklung der RUB ist. Außerdem müssen die dortigen E- Techniker im Java- Praktikum was mit Gantt- Diagrammen machen.
Leider ist die Grafikbibliothek closed source. Deshalb kann ich dir zum ViewerPanel nichts sagen. Ich habe keinen Zugriff auf die Dokumentation dieser Klasse und kann auch selbst nichts testen.

Allerdings ein paar Ideen:
(1) Wenn Tooltips hinter dem ViewerPanel verschwinden, stimmt die Reihenfolge nicht. Das ist meistens ein Problem, dass darauf zurückzuführen ist, dass du AWT mit Swing mischst. Du arbeistest mit Swing. Sollte das ViewerPanel AWT sein, hast du ein Problem, dass sich so nicht lösen lässt.

(2) Flackern bedeutet meistens, dass du zu oft neu zeichnest. Irgendwo eine Schleife, die das tut?

(3) Liegt am verwendeten LayoutManager. Du musst was anderes als BoderLayout nehmen. Lies dich da mal schlau.

(4) Du druckst mithilfe von printComponents und siehst deine Components...irgendwie macht das Sinn. Versuch doch mal, die paint()- Methode des ViewerPanels aufzurufen. Rein semantisch macht das mehr Sinn. Ob es geht, weiß ich nicht, da ich ja das ViewerPanel nicht kenne.
 
D

Dr. K. E.

Gast
Hallo "Heidi",

die Veröffentlichung deines Quelltextes in einem Online-Forum ist sehr heikel.

Laut der Aufgabenstellung, soll eure Software ausschließlich von den 3 Gruppenmitgliedern programmiert werden.
Bitte holt euch keine Hilfe in Internet-Foren. Ziel dieser Studienarbeit war es, dass Ihr Java anwenden und verstehen könnt.

Für Nachfragen jeglicher Art hättet ihr jederzeit zu meiner Sprechstunde ins IA-Gebäude kommen können, oder einen der Übungsgruppenleiter fragen.

Den Quelltext haben wir uns zur Sicherheit gespeichert, bei der Abgabe werden wir darauf achten.

Beim Abgabegespräch in der nächsten Woche werden wir noch einmal hierauf zu sprechen kommen.


Euer Quellcode ist noch verbesserungswürdig, nutzt die Zeit!


Freundliche Grüß
 
S

SlaterB

Gast
;)

ich denke dann mal dass hier geschlossen werden kann,
falls es ein Scherz war oder sonstiger Korrekturbedarf besteht, dann PN senden
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben