Darstellung eines Balkendiagrammes aus einer 2-zeiligen Text-Datei

tbgeeee

Grünschnabel
Hallo,

ich bin neu hier und fange gerade erst mit JAVA an.
Ich hab hier eine Aufgabe vor mir liegen, die mir einiges an Kopfzerbrechen bereitet. Leider habe ich in 3 Wochen in den Fach Computergrafiken Prüfung, komme aber nicht so recht weiter.

Folgende Problemstellung:

Zu erstellen ist ein Histogramm, aus einer Text Datei die zwei Zeilen enthält.

Eine Bsp.-Textdatei ist gegeben:

2,4,30,220
30.34,90.09,40,20,70.5


Zur Erklärung der Textdatei steht folgendes dabei:
Die erste Zeile enthält vier Parameter, die für das Zeichnen des Histogramms notwendig sind.
- Die erste Zahl gibt den Abstand (in Pixel) des ersten Balkens vom linken Rand des Fensters an.
- Die zweite Zahl gibt den Abstand (in Pixel) zweier Balken an.
- Die dritte Zahl gibt die Breite (in Pixel) eines Balkens an.
- Die vierte und letzte Zahl gibt die Höhe (in Pixel) eines Balkens an, der den Wert 100(s. zweite Zeile), d.h. voll Ausdehnung hat.

sämtliche dieser vier Zahlen sind nichtnegative ganze Zahlen, die durch Kommata getrennt sind.

Die zweite Zeile enthält die Werte, die die Höhe der Balken bestimmt
- alle Werte liegen zwischen 0 und 100
- die einzelnen Werte sind ebenfalls durch ein Komma getrennt.
- Jeder Wert kann Nachkommastellen haben.
- der erste Wert steuert die Höhe des ersten Balken, der zweite die des zweiten usw.
- die Summe der Zahlen muss nicht 100 ergeben.

weitere Hinweise:
-Die Eingabedatei braucht nicht auf korrektes Format überprüft zu werden.
- Ein String s wandeln sie folgendermaßen in einen int-Wert: i=(new Integer(s)).integerValue();

Als Farbschema soll die Klasse Farbschema benutzt werden:
Code:
import java.awt.Color;
public class Farbschema{
          private Color[] schema;
          public Farbschema(){
              schema = new Color[8];
              schema[0] = new Color.red;
              schema[1] = new Color.blue;
              schema[2] = new Color.green;
              schema[3] = new Color.yellow;
              schema[4] = new Color.cyan;
              schema[5] = new Color.magenta;
              schema[6] = new Color.black;
              schema[7] = new Color.pink;
          }

Color get Color(int farbIndex){
       int anz=schema.length;
       int pos=farbIndex%anz;
       return schema[pos];
       }
}


Ich habe jetzt mal angefangen, den Frame usw. aufzubauen. Nachfolgend mein Code:

Code:
import java.util.*;
import javax.swing.*;
import java.awt.*;
import javax.swing.JFileChooser;
import java.awt.event.*;
import java.io.*;


	public class HistoPanel extends JPanel{
		
		private JTextField speicherort = new JTextField(" ",80);
		private Farbschema fs;
		
		public HistoPanel(Container c, Farbschema f){

			fs=f;
			JButton bb=new JButton("Beenden");
			JButton eb=new JButton("Erstellen");
			JButton dw=new JButton("Datei waehlen");

		setBackground(Color.white);
		JPanel dp=new JPanel();
		JPanel bp1=new JPanel();
		JPanel bp2=new JPanel();
		c.add(this,"Center");
		c.add(dp,"South");
		dp.setLayout(new GridLayout(5,1));
		bp1.setLayout(new GridLayout(1,2,10,10));
		bp2.setLayout(new GridLayout(1,2,10,10));
		dp.add(new Label("Dateiname: "));
		dp.add(speicherort);
		WachDienst wD = new WachDienst();
		WachHund wH = new WachHund();
		bb.addActionListener(wD);
		eb.addActionListener(wD);
		dw.addActionListener(wH);
		bp1.add(dw);
		bp1.add(new Label(" "));
		dp.add(bp1);
		dp.add(new Label(" "));
		bp2.add(eb);
		bp2.add(bb);
		dp.add(bp2);
		}


		public void paintComponent(Graphics g){
			
		}
		
		public class WachDienst implements ActionListener{
			public void actionPerformed(ActionEvent e){
			String command= e.getActionCommand();
			if (command.equals("Beenden")) System.exit(0);
			else if (command.equals("Erstellen")){
				repaint();
					}
		}
		
		}
	
		public class WachHund implements ActionListener{
			public void actionPerformed(ActionEvent evt){

				JFileChooser fc= new JFileChooser("c:");
				int returnVal = fc.showOpenDialog(getParent());
				if (returnVal == JFileChooser.CANCEL_OPTION)
					System.out.println("Dialog abgebrochen");
				else
					speicherort.setText(""+fc.getSelectedFile().getPath()+fc.getSelectedFile().getName());					

						
				}
		}

		public class FileReader{
			public FileReader(String fc.getSelectedFile()){
				FileReader fr = new FileReader(fc.getSelectedFile());				

				char[] buffer = new char[128];
				File readfile = new File(fc.getSelectedFile());
				if (readfile.exists()){
					FileReader fr = new FileReader(readfile);
				fr.read(buffer,0,100);
				fr.close();
				}
			catch (Exception ex){
				System.out.println("Problem"+readfile.getName());
			}
		}
		else{
				System.out.println("File not found"+readfile.getName());
		}
			System.out.print("Buffer>");
			for (int i = 0; i< buffer.length; i++){
				System.out.print(buffer[i]);
			}
			System.out.print("<Buffer");
}

Meine main-Routine lautet folgendermaßen:

Code:
import SimpleFrame.*;
import javax.swing.*;
import java.awt.*;

public class HistoFrame extends SimpleFrame{
		public HistoFrame(){

			setSize(300,300);
			new HistoPanel(getContentPane(),new Farbschema());
			setTitle("Histogramm");
			showIt();
			}

	public static void main(String[] args){
		HistoFrame hf= new HistoFrame();

	}
}

Der Frame passt soweit, die Dateiortrückgabe ins JTextField kann man vielleicht auch anders bzw. einfacher realisieren.

Meine Überlegungen gehen dahin, dass ich ein zeilenweises Einlesen der Datei mithilfe des BufferedReaders benötige und dann den Buffer irgendwie einteilen kann, damit ich mit g.fillRect die benötigten Startwerte bekomme. Int x und int y sind ja aus der Textdatei gegeben und die Breite wird auch vom Textfile mitgeliefert.
Die Höhe der einzelnen Balken würde sich ja dann aus den 220*"0.(Zahl in Zeile 2)" ergeben.

Im Internet hab ich was mit StringTokenizer gefunden, allerdings komme ich da auch nicht weiter.

Wär echt spitze, wenn vielleicht einer zufällig nen Weg aus meiner Misere wüsste ;)

Vielen Danke schonmal!

Tobi
 
Hi,

du brauchst deine Textdatei nur zeilenweise (mithilfe eines BufferedReaders) einlesen und diese Zeile dann mithilfe der Methode 'String[] String.split(String regex)' in ein Array unterteilen.

Bsp:

Java:
//erste Zeile einlesen und splitten
String[] werteZeileEins = myBufferedReader.readLine().split(",");

Lg, Yanick
 
Hi,

erstmal danke für deine schnelle Antwort. Ich hab jetzt mittels BufferedReader die beiden Zeilen eingelesen.
Mein Code sieht folgendermaßen aus:

Code:
public void actionPerformed(ActionEvent evt){

				JFileChooser fc= new JFileChooser("C:");
				int returnVal = fc.showOpenDialog(getParent());
				if (returnVal == JFileChooser.APPROVE_OPTION)
					{
					selectedFile = fc.getSelectedFile();
					speicherort.setText(""+fc.getSelectedFile().getPath());
					try{
						BufferedReader bfr= new BufferedReader(new FileReader(selectedFile));
							while((line = bfr.readLine()) !=null){
							System.out.println("gelesen>"+line+"<");
							}
					bfr.close();
					}
					catch(IOException e){
					System.out.println("Problem in"+selectedFile.getName());					

					speicherort.setText(""+fc.getSelectedFile().getPath()+fc.getSelectedFile().getName());

wenn ich also nun den Buffer printe, bekomm ich die beiden Zeilen. Wo muss ich nun die split-funktion einbauen? anstelle des system.out.println("gelesen"+line+....?
Kann ich ihm dann 2 mal untereinander die split-Funktion geben, einmal mit werteersteZeile und dann nochmal mit Werte2teZeile?

Außerdem hätte ich dann noch ein kleines Problem. Wie kann ich dann die einzelnen Splits addressieren? Er liest ja die komplette Zeile ein und speichert die Werte in einem String-Array. Wäre dann der erste wert werteerstezeile[0], der zweite werteerstezeile[1] usw.?

Sorry wenn ich vielleicht doofe Fragen stelle, aber ich bin auf dem Java-Gebiet noch nicht so bewandert ;)

Gruß Tobi
 
Also ich hab jetzt gerade nochmal selbst rumprobiert.

Code:
try{
						BufferedReader bfr= new BufferedReader(new FileReader(selectedFile));
							while ((line = bfr.readLine()) !=null){
							String[] werteersteZeile = bfr.readLine().split(",");
							 
							System.out.println("gelesen>"+werteersteZeile[0]+"<");
							
							}
					bfr.close();

Was ich bei meinem vorherigen Post nicht bedacht habe, er schreibt mir natürlich immer die letzte Zeile die er gerade gelesen hat in den String-Array. Wie kann ich das nun machen, dass er mir die Werte von Zeile 1 in "werteersteZeile" und die Werte von Zeile 2 in "wertezweiteZeile" schreibt?
Danke nochmals ;)
 
Hi,

ich habe dir eine Klasse 'BarDiagram' zusammengebastelt, die deinen Ansprüchen gerecht werden sollte:

Java:
package de.tutorials.barDiagram;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URI;

import javax.swing.JPanel;

/**
 * Erstellt ein Balken Diagram und zeigt dieses an
 * Die Daten dafür holt es sich aus einer Textdatei
 * 
 * @author Yanick Dickbauer
 */
public class BarDiagram extends JPanel{

	/**
	 * Erstellt ein neues BarDiagram Object
	 * @param settingFile Der URI der settingFile
	 * @throws IOException Falls die Datei nicht gefunden wurde oder fehlerhaft ist
	 */
	public BarDiagram(URI settingFile) throws IOException{
		loadSettingsFromFile(settingFile);
		farbschema = new Farbschema();
		addComponentListener(new ComponentAdapter(){
			public void componentResized(ComponentEvent e) {
				paintBars();
				repaint();
			}
		});
	}
	
	/** Die ganzen Settings aus der Textdatei holen */
	private void loadSettingsFromFile(URI settingFile) throws IOException{
		FileInputStream fis = new FileInputStream(new File(settingFile));
		BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
		//ich kann mich darauf verlassen, dass es genau zwei Zeilen gibt
		//erste zeile
		String[] l1 = reader.readLine().split(",");
		leftGap = Integer.valueOf(l1[0]);
		barGap = Integer.valueOf(l1[1]);
		barWidth = Integer.valueOf(l1[2]);
		barMaxHeight = Integer.valueOf(l1[3]);
		//zweite zeile enthält beliebig viele einträge (so viele, wie es balken gibt)
		String[] l2 = reader.readLine().split(",");
		anzBars = l2.length;
		relativeBarHeights = new float[anzBars];
		for (int i = 0; i < anzBars; i ++){
			relativeBarHeights[i] = Float.valueOf(l2[i]);
		}
	}	
	
	@Override
	/**
	 * Falls ein Buffer existiert, wird dieser auf das Panel gezeichnet
	 */
	public void paint(Graphics g) {
		if (buffer != null)
			g.drawImage(buffer, 0, 0, null);
	}

	/**
	 * Hier werden die ganzen Balken in den Buffer gemalt
	 */
	private void paintBars(){
		buffer = new BufferedImage(getWidth(), getHeight(),
				BufferedImage.TYPE_INT_RGB);
		Graphics g = buffer.getGraphics();
		g.setColor(this.getBackground());
		g.fillRect(0, 0, buffer.getWidth(), buffer.getHeight());
		//jeden Balken einzeln Zeichnen
		for (int i = 0; i < anzBars; i++){
			int height = (int)((relativeBarHeights[i] / 100) * barMaxHeight);
			int x = leftGap + (barWidth * i) + (barGap * i);
			int y = buffer.getHeight() - height;  //ganz unten zum zeichnen beginnen
			//höhe ausrechnen
			//zeichnen
			g.setColor(farbschema.getColor(i));
			g.fillRect(x, y, barWidth, height);
		}
	}
	
	/**
	 * Damit man von außen weiß wie viel Platz dieses Panel haben sollte
	 */
	public Dimension getMinimumSize(){
		//mindestens die Höhe des höchsten Balkens:
		int height = (int)((getBiggestBar() / 100) * barMaxHeight);
		//breite
		int width = 0;
		width += leftGap;
		width += barWidth * anzBars;
		width += barGap * (anzBars - 1);
		return new Dimension(width, height);
	}
	
	/** Ermittelt den Größten Balken */
	private float getBiggestBar(){
		float biggest = Float.MIN_VALUE;
		for (float f : relativeBarHeights)
			if (f > biggest) biggest = f;
		return biggest;
	}
	
	
	/** Das Speicherabbild des Bildes, Stichwort DoubleBuffering */
	private BufferedImage buffer;
	/** Linker Rand */
	private int leftGap;
	/** Abstand zwischen den einzelnen Balken */
	private int barGap;
	/** Breite eines einzelnen Balkens */
	private int barWidth;
	/** Höhe eines Balkens in Pixel der eine Relative Höhe von 100.0f hat */
	private int barMaxHeight;
	/** Anzahl der Balken */
	private int anzBars;
	/** Ein Farbschema Objekt - sollte man eigentlich Statisch lösen, aber wenn Lehrer es so will... */
	private Farbschema farbschema;
	/** Ein Array der Realtiven Höhen der einzelnen Balken */
	private float[] relativeBarHeights;
	
	/* Fürs serialisieren, falls gebraucht */
	private static final long serialVersionUID = -4500166097946028489L;
}

Ich habe alles dokumentiert, falls du trotzdem Fragen hast darfst du gerne fragen ;-)

BTW: Deine Farbschema Klasse ist nicht richtig, die 'new's gehöhren weg
Lg, Yanick
 
Zuletzt bearbeitet:
Hier gibts noch ein Testprogramm dazu:

Java:
package de.tutorials.barDiagram;

import javax.swing.JFrame;

public class BarDiagramFrame extends JFrame {

    public BarDiagramFrame(){
        initialize();
    }
    
    public static void main(String[] args){
        new BarDiagramFrame().setVisible(true);
    }
    
    private void initialize(){
        setTitle("Bar Diagram Frame");
        setSize(500, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        BarDiagram barDiagram = null;
        try {
            barDiagram = new BarDiagram(this.getClass().getResource("barSettings.txt").toURI());
        } catch (Exception e) {
            System.err.println(e);
            System.exit(0);
        }
        add(barDiagram);
    }
    
    
    private static final long serialVersionUID = -5822051436571089389L;

}

Lg, Yanick
 
Hallo Yanick,

also erstmal vielen vielen dank, dass du dir die Mühe machst mir zu helfen.
Das Programm von dir läuft leider nicht bei mir. Wenn ich es kompilieren will dann bekomme ich folgende Fehler:

Code:
BarDiagramFrame.java:40: cannot resolve symbol
symbol  : class barDiagram
location: class de.tutorials.barDiagram.BarDiagramFrame
              barDiagram BarDiagram = null;
              ^
BarDiagramFrame.java:44: cannot resolve symbol
symbol  : variable barDiagram
location: class de.tutorials.barDiagram.BarDiagramFrame
                  barDiagram = new BarDiagram(this.getClass().getResource("barSe
ttings.txt").toURI());
                  ^
BarDiagramFrame.java:44: cannot resolve symbol
symbol  : class BarDiagram
location: class de.tutorials.barDiagram.BarDiagramFrame
                  barDiagram = new BarDiagram(this.getClass().getResource("barSe
ttings.txt").toURI());
                                   ^
BarDiagramFrame.java:44: cannot resolve symbol
symbol  : method toURI ()
location: class java.net.URL
                  barDiagram = new BarDiagram(this.getClass().getResource("barSe
ttings.txt").toURI());
                                              ^
BarDiagramFrame.java:54: cannot resolve symbol
symbol  : variable barDiagram
location: class de.tutorials.barDiagram.BarDiagramFrame
              add(barDiagram);
                  ^
5 errors

Ich hab mir das Programm von dir mal näher angeschaut, leider weiß ich nicht ob wir mit dem FileInputStream arbeiten dürfen, da wir das bisher noch garnicht behandelt haben.

Was ich nun ausprobiert habe ist folgendes:

Code:
	public void actionPerformed(ActionEvent evt){

				JFileChooser fc= new JFileChooser("C:");
				int returnVal = fc.showOpenDialog(getParent());
				if (returnVal == JFileChooser.APPROVE_OPTION){

						selectedFile = fc.getSelectedFile();
					speicherort.setText(""+fc.getSelectedFile().getPath());
				try{
						BufferedReader bfr= new BufferedReader(new FileReader(selectedFile));
							int i;
							for (i = 0; i <1; i++){
							String[] WerteZ1 = bfr.readLine().split(",");
							 
							//System.out.println("gelesen>"+WerteZ1[0]+"<");
							
							}
							for (i = 1; i<2; i++){
							String[] WerteZ2 = bfr.readLine().split(",");
							 
							//System.out.println("gelesen>"+WerteZ2[1]+"<");
							}
					bfr.close();
     				}

			catch(Exception ex){
					System.out.println("Problem in"+selectedFile.getName());					
			}		

			}
		}
		
	}

Ich bekomme nun also einmal die Werte von Zeile 1 aufgesplittet in WerteZ1 und dann auch die Werte von Zeile 2 aufgesplittet in WerteZ2.
Ist die Grundüberlegung die ich da angestellt habe komplett falsch? Oder würde es mit dieser Lösung auch funktionieren?
Mein Problem was ich jetzt noch habe ist, dass ich außerhalb der if-Schleife nicht auf WerteZ1 und WerteZ2 zugreifen kann :(

Gibts dafür auch ne Lösung? *ggg*

Ich hoffe ich nerve noch nicht ;)

Many thx and greetz,

Tobi
 
Bittesehr:

Java:
public class DeineKlasse extends JFrame{
    public void actionPerformed(ActionEvent evt){
        JFileChooser fc= new JFileChooser(".");
        int returnVal = fc.showOpenDialog(getParent());
        if (returnVal == JFileChooser.APPROVE_OPTION){
            File selectedFile = fc.getSelectedFile();
            //speicherort.setText(""+fc.getSelectedFile().getPath());
            try{
                BufferedReader bfr= new BufferedReader(new FileReader(selectedFile));
                //ich kann mich darauf verlassen, dass es genau zwei Zeilen gibt
                //erste zeile
                String[] l1 = bfr.readLine().split(",");
                leftGap = Integer.valueOf(l1[0]);
                barGap = Integer.valueOf(l1[1]);
                barWidth = Integer.valueOf(l1[2]);
                barMaxHeight = Integer.valueOf(l1[3]);
                //zweite zeile enthält beliebig viele einträge (so viele, wie es balken gibt)
                String[] l2 = bfr.readLine().split(",");
                anzBars = l2.length;
                relativeBarHeights = new float[anzBars];
                for (int i = 0; i < anzBars; i ++){
                    relativeBarHeights[i] = Float.valueOf(l2[i]);
                }
                bfr.close();
             } catch(Exception ex){
                System.err.println("Problem in Datei: '"+selectedFile.getName()+"'");
            }        
        }
    }
    
    private int leftGap;
    private int barGap;
    private int barWidth;
    private int barMaxHeight;
    private int anzBars;
    private float[] relativeBarHeights;
}

Die Werte werden nun alle in die Membervariablen (stehen ganz unten) geschrieben.
Du musst die Balken jetzt nur noch zeichnen, wie das geht, kannst du dir ja in meiner Methode: 'paintBars()' anschauen.

PS: Meine Klasse funktioniert einwandfrei (selbst schon ausführlich getestet), du machst wahrscheinlich Fehler beim Kompilieren etc ;-)

Lg, Yanick
 
Hi Yanick!

Ich habe erfolg zu vermelden *gg*
Ohne deine Hilfe hätte ich das wahrscheinlich nie geschafft!
Also ich hab deinen Code mal in mein Programm eingebaut und das alles so hingebastelt wie ich mir das in meinem Programm zurechtgelegt hatte.
Ich poste mal meinen kompletten "fertigen" Code.

Code:
//Meine Hauptdatei HistoPanel.java

import java.util.*;
import javax.swing.*;
import java.awt.*;
import javax.swing.JFileChooser;
import java.awt.event.*;
import java.io.*;


	public class HistoPanel extends JPanel{
		
		private JTextField speicherort = new JTextField(" ",80);
		private Farbschema fs;
		private File selectedFile;
		private int leftGap;
		private int barGap;
		private int barWidth;
		private int barMaxHeight;
		private int anzBars;
		private float[] relativeBarHeights;
		
			public HistoPanel(Container c, Farbschema f){

			fs=f;
			JButton bb=new JButton("Beenden");
			JButton eb=new JButton("Erstellen");
			JButton dw=new JButton("Datei waehlen");
		
		setBackground(Color.white);
		JPanel dp=new JPanel();
		JPanel bp1=new JPanel();
		JPanel bp2=new JPanel();
		c.add(this,"Center");
		c.add(dp,"South");
		dp.setLayout(new GridLayout(5,1));
		bp1.setLayout(new GridLayout(1,2,10,10));
		bp2.setLayout(new GridLayout(1,2,10,10));
		dp.add(new Label("Dateiname: "));
		dp.add(speicherort);
		WachDienst wD = new WachDienst();
		WachHund wH = new WachHund();
		bb.addActionListener(wD);
		eb.addActionListener(wD);
		dw.addActionListener(wH);
		bp1.add(dw);
		bp1.add(new Label(" "));
		dp.add(bp1);
		dp.add(new Label(" "));
		bp2.add(eb);
		bp2.add(bb);
		dp.add(bp2);
		}

		




		public class WachDienst implements ActionListener{
			public void actionPerformed(ActionEvent e){
			String command= e.getActionCommand();
			if (command.equals("Beenden")) System.exit(0);
			
			else if (command.equals("Erstellen")){
				
			repaint();
			
					}
		}
}



		public class WachHund implements ActionListener{
				
				

				public void actionPerformed(ActionEvent evt){
				        JFileChooser fc= new JFileChooser(".");
				        int returnVal = fc.showOpenDialog(getParent());
				        if (returnVal == JFileChooser.APPROVE_OPTION){
				        File selectedFile = fc.getSelectedFile();
				        speicherort.setText(""+fc.getSelectedFile().getPath());
			            try{
			                BufferedReader bfr= new BufferedReader(new FileReader(selectedFile));
			                String[] l1 = bfr.readLine().split(",");
			                leftGap=(new Integer(l1[0])).intValue();
			                barGap =(new Integer(l1[1])).intValue();
			                barWidth =(new Integer(l1[2])).intValue();
			                barMaxHeight =(new Integer(l1[3])).intValue();
			                String[] l2 = bfr.readLine().split(",");
			                anzBars = l2.length;
			                relativeBarHeights = new float[anzBars];
			                for (int i = 0; i < anzBars; i ++){
			                    relativeBarHeights[i] =(new Float(l2[i])).floatValue();
			                
					//System.out.println(""+leftGap);
					//System.out.println(""+barGap);
					//System.out.println(""+barWidth);
					//System.out.println(""+barMaxHeight);
					//System.out.println(""+anzBars);



				    }
			                bfr.close();
				        } catch(Exception ex){
				                System.err.println("Problem in Datei: '"+selectedFile.getName()+"'");
				        }       
			        }
			 }
							


}
		
		public void paintComponent(Graphics g){
						super.paintComponent(g);
						if(anzBars==0) return;
					for(int i = 0; i<anzBars; i++){
					int height = (int)((relativeBarHeights[i] / 100) * barMaxHeight);
					int x = leftGap + (barWidth * i) + (barGap * i);
					int y = getHeight()-height;
					g.setColor(fs.getColor(i));
					g.fillRect(x,y,barWidth, height);
			}
		}



}
Code:
//Das bereits vorgegebene Farbschema.java:

import java.awt.Color;

public class Farbschema{

	private Color[] schema;
	public Farbschema(){

			schema = new Color[8];
			schema[0] = Color.red;
			schema[1] = Color.blue;
			schema[2] = Color.green;
			schema[3] = Color.yellow;
			schema[4] = Color.cyan;
			schema[5] = Color.black;
			schema[6] = Color.magenta;
			schema[7] = Color.pink;
			}

		Color getColor(int farbIndex){
			int anz=schema.length;
			int pos=farbIndex%anz;
			return schema[pos];

		}
}

und meine MainRoutine:
Code:
//Meine MainRoutine HistoFrame.java:

import SimpleFrame.*;
import javax.swing.*;
import java.awt.*;

public class HistoFrame extends SimpleFrame{
		public HistoFrame(){

			setSize(300,300);
			new HistoPanel(getContentPane(),new Farbschema());
			setTitle("Histogramm");
			showIt();
			}

	public static void main(String[] args){
		HistoFrame hf= new HistoFrame();

	}
}

Ich hatte die ganze Zeit das Problem, dass er von mir als Wert einen int-Wert haben wollte, gefunden hatte er aber einen java.lang.integer. Das hab ich mit dem intValue dann gelöst bekommen.

Der einzige Fehler den mein Programm noch hat ist der:
Er zeichnet mir die Balken, sobald ich im JFileChooser die Datei öffne. Eigentlich sollte er sie ja erst zeichnen, wenn ich den Button "Erstellen" drücke.
Ich weiß leider im Moment noch nicht, wo da der Fehler liegt :( Aber das ist ja ein kleiner Schönheitsfehler ;)

Also schonmal vielen vielen Dank Yanick!

Lieben Gruß zurück,

Tobi
 
Gratulation ;-)

Du kannst erreichen, dass die Balken erst dann zeichnet werden, wenn du 'Erstellen' geklickt hast, indem du einfach eine boolean Variable 'boolean erstelltGedrückt = false' in deine 'HistoPanel Klasse' einbaust, und in deinem 'paintComponent()' diese Abfrage machst:
Java:
        if (anzBars == 0 || !doPaintBars)
            return;
und in deinem 'Wachdienst' musst du bei "Erstellen" diese Variable auf true setzen bevor du das repaint() aufrufst ;-)

Übrigens solltest du folgendes an deinem Programmierstil ein wenig ändern:
  • Gewöhne dir an, an den übersichltichen Stellen ein paar kleine aber nützliche Kommentare einzubauen
  • Auf jeden Fall: RICHTIGES EINRÜCKEN, dein Einrückstil ist grauenvoll^^, kleiner Tipp für Eclipse Benutzer: Ctrl+Shift+F
  • Es ist nicht nötig dass du für deine Events eigene Klassen machst, und wenn, dann besser benennen als "Wachdienst" und "Wachhund" :-D
Es war für mich am ersten Blick nicht wirklich leicht, mich zu orientieren, auch wenn dein Projekt nicht allzu groß ist.

Lg, Yanick
 
Zurück