tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
550
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    JAVAx JAVAx ist offline Mitglied
    Registriert seit
    Sep 2010
    Beiträge
    19
    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
    JavaX
    Geändert von JAVAx (24.06.11 um 21:21 Uhr)
     

  2. #2
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  3. #3
    SE 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*
     

  4. #4
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    @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 ;)

  5. #5
    JAVAx JAVAx ist offline Mitglied
    Registriert seit
    Sep 2010
    Beiträge
    19
    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...
     

  6. #6
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  7. #7
    Xeonkryptos Xeonkryptos ist offline Mitglied
    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!
     

  8. #8
    Avatar von PeaBull
    PeaBull PeaBull ist offline Mitglied
    Registriert seit
    Jun 2011
    Ort
    BW
    Beiträge
    13
    Ja, ich wusste, nur nicht wie.
    Hier mein neuer Code, noch nicht perfekt aber besser.
    Info: Grundstruktur aus dem Internet kopiert, Rest selber gemacht
    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
    
    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();
        }
     
    }
    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 Klick
    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 :-)

  9. #9
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  10. #10
    Avatar von PeaBull
    PeaBull PeaBull ist offline Mitglied
    Registriert seit
    Jun 2011
    Ort
    BW
    Beiträge
    13
    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 :-)

  11. #11
    genodeftest genodeftest ist offline Mitglied Brillant
    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)
    Code java:
    1
    
    System.out.println("Hallo");
    hilfreich zu Java: Really Big Index, Java ist auch eine Insel Band 1 und Band 2.
    ___________
    Ubuntu Bug #1: Microsoft has a majority market share
    Casecon: Projekt leiser Käse

  12. #12
    Avatar von PeaBull
    PeaBull PeaBull ist offline Mitglied
    Registriert seit
    Jun 2011
    Ort
    BW
    Beiträge
    13
    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

  1. Antworten: 1
    Letzter Beitrag: 16.06.10, 19:40
  2. Probleme auf ein Java Applet zu zeichnen
    Von Prophet05 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 12.11.07, 07:14
  3. Pfeile zeichnen in Java
    Von jorgeHX im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 4
    Letzter Beitrag: 15.06.07, 11:52
  4. Probleme beim entpacken von Zip-files mit Java
    Von torsch2711 im Forum Java
    Antworten: 2
    Letzter Beitrag: 13.02.06, 12:26
  5. Zeichnen in Java
    Von jorgeHX im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 4
    Letzter Beitrag: 20.12.04, 20:15