ERLEDIGT
NEIN
NEIN
ANTWORTEN
11
11
ZUGRIFFE
550
550
EMPFEHLEN
-
Hallo Freunde,
es geht darum das ich ein Balkendiagramm zeichnen möchte. Die Daten werden aus einem Array ausgelesen und reingeschrieben. Mein Problem besteht darin, dass ich immer nur ein Balkendiagramm zeichnen kann. Es wird also eins gezeichnet dann eine Zeile unter wird eine neue gezeichnet und das andere aber wieder gelöscht. Gibt es außer der repaint methode vielleicht noch etwas anderes? Irgendeiner ne Idee?
Ich muss das ganze mit AWT lösen Swing ist nicht erlaubt!
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
class Schueler extends Frame{ private Model m_Mod; int[] a; int b=0; int j=0; Schueler(Model mMod){ this.m_Mod = mMod; setVisible(true); setSize(900,400); a= m_Mod.schueler.Histogramm_Alter(); int i=0; while(i!=a.length-1){ try { if(a[i]>0){ Thread.sleep(20); // repaint(50,b+30,400,900); System.out.println(a[i]); repaint(); } } catch (InterruptedException e) { e.printStackTrace(); } b+=50; ++i; } } @Override public void paint(Graphics g){ g.setColor(Color.red); g.fillRect(50,b+50,50,50); } }
Vielen Dank für eure Mühe
JavaXGeändert von JAVAx (24.06.11 um 21:21 Uhr)
-
24.06.11 17:13 #2
- Registriert seit
- Jun 2009
- Beiträge
- 870
Wie wäre es, für jeden Balken ein neues Objekt zu erzeugen, und die dann alle in einen Frame packen? das reduziert zumindest einige Fehlerquellen.
Und noch etwas (zeile 17 in deinem Code):
Du solltest den AWT-Event-Thread niemals schlafen legen, denn in der Zeit kann er keine Events empfangen, damit ist die verarbeitung von z.B. resize-events, Mausklicks, Tastatureingaben ausgeschlossen. Und repaint() funktioniert nicht unbedingt ordnungsgemäß.Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
25.06.11 01:02 #3SE Tutorials.de Gastzugang
Ja gibt es, in dem du nicht von Frame ableitest sondern von Panel. Du zeichnest halt jedes Diagramm auf ein eigenes Panel ... diese fügst du dann nachher nur noch den Vorgaben entsprechend mit einem Layout-Manager ins Frame ein.
//EDIT
PS : erlaube mir bitte die Frage : WER zum Henker gibt dir vor NICHT mit Swing zu arbeiten ? Das ist nun wirklich nicht mehr Zeitgemäß. Ich denke da will sich nur jemand die Mühe sparen und seine alten Aufzeichnungen an ein neues System anzupassen*
-
25.06.11 10:43 #4
@SPiKEe
Es ist egal, ob etwas zeitgemäß ist oder nicht, Vorgabe ist Vorgabe und daran muss man sich halten. Es gibt auch immer noch Systeme, die in Java 1.4 (sicherlich auch noch ältere) geschrieben und immer noch produktiv im Einsatz sind und man das aus bestimmten Gründen nicht ändern will. Genauso auch mit anderen Sprachen, ein ziemlich großer Teil der Software auf Unixservern ist Uraltcode, der aber immer noch produktiv im Einsatz ist.Man sagt, das Schwert eines Samurai sei seine Seele ...
Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.
Das Schmieden ist eine Kunst; Das Schreiben auch ;)
-
das ist für die uni gedacht ...
)
wir haben bisher nicht mit swing gearbeitet ... kommt noch ! Panel ist vielleicht auch eine gute Idee... habe es mir grad angesehen... ist es denn vielleicht auch anders zu lösen ? man kann mit repaint die neuen zeichen bereiche angeben... das klappt bei mri aber nicht...
-
26.06.11 02:39 #6
- Registriert seit
- Jun 2009
- Beiträge
- 870
Warum willst du Bereiche angeben, die neu gezeichnet werden sollen? Erzeuge einfach für jeden Balken in deinem Balkendiagramm eine neue Instanz von einer Klasse, die z.B. von Panel oder Canvas erbt. Dann kannst du auch einzelne Balken neu zeichen.
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
27.06.11 12:43 #7
- Registriert seit
- Jun 2011
- Beiträge
- 12
Ich empfehle dir, deinen Code nochmal in tags zu setzen, damit er besser gelesen werden kann. Diese weise mag man hier im Forum nicht!
-
Ja, ich wusste, nur nicht wie.
Hier mein neuer Code, noch nicht perfekt aber besser.
Info: Grundstruktur aus dem Internet kopiert, Rest selber gemacht
Mein Problem ist jetzt nur, dass ich es nicht hin bekomme, dass der Strich auch da ansetzt, wo ich mit der Maus hinklicke, sondern wenn ich den ersten Klick mache, zeichnet er den Strich aus dem Nullpunkt zum ersten KlickCode :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
import java.awt.*; import java.awt.event.*; class ZeigerOrt extends Frame implements MouseListener { TextField tf; int x1,y1,x2,y2,x3,y3,x4,y4; int i=0; ZeigerOrt() { setSize(600,600); setTitle("Punkt Koordinaten!"); setBackground(Color.gray); setLayout(null); tf= new TextField(""); tf.setBounds(40,60,300,20); tf.setBackground(Color.lightGray); //tf.addMouseListener(this); add(tf); addMouseListener(this); setVisible(true); } public void mouseClicked(MouseEvent m) { if(m.getClickCount()==1) i=i+m.getClickCount(); if(i==1 || (i%4==1)) { x1 = m.getX(); y1 = m.getY(); } if(i==2 || (i%4==2)) { x2 = m.getX(); y2 = m.getY(); } if(i==3 || (i%4==3)) { x3 = m.getX(); y3 = m.getY(); } if(i%4==0) { x4 = m.getX(); y4 = m.getY(); } tf.setText("P1:"+x1+" "+y1+" P2:"+x2+" "+y2+" P3:"+x3+" "+y3+" P4:"+x4+" "+y4+" "+i); System.out.println(m+" "+i); } public void mouseEntered(MouseEvent a){} public void mouseExited(MouseEvent b){} public void mousePressed(MouseEvent c){} public void mouseReleased(MouseEvent d){} public void paint(Graphics g) { g.drawLine(x1, y1, x2, y2); g.drawLine(x3, y3, x4, y4); g.setColor(Color.black); setVisible(true); repaint(); } public static void main (String a[]) { ZeigerOrt z = new ZeigerOrt(); } }Geändert von PeaBull (27.06.11 um 16:53 Uhr)
Die Techniker lachen die Informatiker aus, dass wir nur Computerratten sind, hier meine Antwort:
WIR werden die Maschinen programmieren, die EUCH die Arbeitsplätze wegnehmen :-)
-
28.06.11 10:13 #9
- Registriert seit
- Jun 2009
- Beiträge
- 870
Du musst jeweils die Position des vorangegangenen Klicks speichern, da du ja von einem Punkt (1. Klick) zum anderen Punkt (2. Klick) zeichnen möchtest.
Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
Hab es hinbekommen. Jetzt soll aber Parallel dazu ein Ball fallen. Ich habe ein Thread gemacht, das kann ich aber nicht benutzen, da ja auch noch zeichnen möchte und der Computer kann durch das Thread eben dies nicht gleichzeitig.
Nun wollte ich ein Timer einbauen, aber ich muss zugeben, dass ich nicht weiss, wie das funktioniert bzw. ich nicht weiss, wie ich ihn in folgendem code einbinden kann:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
import java.awt.*; import java.awt.event.*; class ZeigerOrt extends Frame implements MouseListener { TextField tf; int x1,y1,x2,y2,x3,y3,x4,y4; int i=0; ZeigerOrt() { setSize(600,600); setTitle("Punkt Koordinaten!"); setBackground(Color.gray); setLayout(null); tf= new TextField(""); tf.setBounds(40,60,300,20); tf.setBackground(Color.lightGray); //tf.addMouseListener(this); add(tf); addMouseListener(this); setVisible(true); } public void mouseClicked(MouseEvent m) { // x2=x1; // y2=y1; //x4=x3; //y4=y3; if(m.getClickCount()==1) i=i+m.getClickCount(); if(i==1 || (i%4==1)) { x1 = m.getX(); y1 = m.getY(); } if(i==2 || (i%4==2)) { x2 = m.getX(); y2 = m.getY(); } if(i==3 || (i%4==3)) { x3 = m.getX(); y3 = m.getY(); } if(i%4==0) { x4 = m.getX(); y4 = m.getY(); } tf.setText("P1:"+x1+" "+y1+" P2:"+x2+" "+y2+" P3:"+x3+" "+y3+" P4:"+x4+" "+y4+" "+i); System.out.println(m+" "+i); } public void mouseEntered(MouseEvent a){} public void mouseExited(MouseEvent b){} public void mousePressed(MouseEvent c){} public void mouseReleased(MouseEvent d){} public void paint(Graphics g) { if ((i==2)||(i==3)||(i%4==2)||(i%4==3)) {g.drawLine(x1, y1, x2, y2);} if ((i==4)||(i%4==0)||(i%4==1)) {g.drawLine(x3, y3, x4, y4);} g.setColor(Color.black); repaint(); for (int y10=20; y10<=470; y10++) { // try // { // Thread.sleep(10); // } // catch(InterruptedException x){} // javax.swing.Timer t = new javax.swing.Timer( 1000, new ActionListener() { // public void actionPerformed( ActionEvent e ) { // g.repaint();} // } // g.clearRect(100, y10-1, 20, 20); // g.fillOval(100,y10,20,20); // g.setColor(new Color(255, 0, 0)); } } public static void main (String a[]) { ZeigerOrt z = new ZeigerOrt(); } }Die Techniker lachen die Informatiker aus, dass wir nur Computerratten sind, hier meine Antwort:
WIR werden die Maschinen programmieren, die EUCH die Arbeitsplätze wegnehmen :-)
-
01.07.11 15:29 #11
- Registriert seit
- Jun 2009
- Beiträge
- 870
Prinzipiell ist ein Timer die beste Lösung für deinen Fall.
Allerdings sollte er auf keinen Fall in der paint()-Methode erzeugt werden, sonst würde bei jedem Aufruf dieser Methode ein neuer Timer erzeugt, der widerum den Aufruf von paint() anstößt, und so weiter (das gibt eine Endlosschleife und wahrscheinlich bald unschönes Verhalten wie Überlastung deines PCs und StackOverflowError oder OutOfMemoryException).
Korrekt wäre:
der Timer wird in deinem Konstructor erzeugt und gestartet, Timeout ca. 50-100 ms.
Dein Timer sollte folgendes tun:
• Die neuen Werte von Variablen berechnen
• repaint() aufrufen (ggf. nur wenn isVisible() zutrifft)
Die Methode paint() ist für das Zeichnen zuständig. nicht nur das Zeichnen am Anfang (wenn die graphischen Komponenten erzeugt werden), sondern zu jeder beliebigen Zeit.Code bitte so einfügen: [java]System.out.println("Hallo");[/java] (Analog für andere Programmiersprachen)
hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.Code java:1
System.out.println("Hallo");
___________
Ubuntu Bug #1: Microsoft has a majority market share
Casecon: Projekt leiser Käse
-
oke, cool, ich werds mal versuchen.
Die Techniker lachen die Informatiker aus, dass wir nur Computerratten sind, hier meine Antwort:
WIR werden die Maschinen programmieren, die EUCH die Arbeitsplätze wegnehmen :-)
Ähnliche Themen
-
Java - Vektor Grafik - Probleme beim Zeichnen mit Schleifen ohne Ende
Von koddy013 im Forum JavaAntworten: 1Letzter Beitrag: 16.06.10, 19:40 -
Probleme auf ein Java Applet zu zeichnen
Von Prophet05 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 1Letzter Beitrag: 12.11.07, 07:14 -
Pfeile zeichnen in Java
Von jorgeHX im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 15.06.07, 11:52 -
Probleme beim entpacken von Zip-files mit Java
Von torsch2711 im Forum JavaAntworten: 2Letzter Beitrag: 13.02.06, 12:26 -
Zeichnen in Java
Von jorgeHX im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 4Letzter Beitrag: 20.12.04, 20:15





Zitieren
Login





