Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[JAVA] direct grafiek repainten

Pagina: 1
Acties:
  • 619 views sinds 30-01-2008
  • Reageer

  • L01
  • Registratie: December 2003
  • Laatst online: 17-11 21:53
Ik heb een programma geschreven dat een array sorteerd van klein naar groot. Dit werkt prima.

Ik wilde dit grafisch afbeelden en heb dus een class geschreven die netjes de array die ik aanlever via mijn sorteer class weergeeft als een grafiek.

Nu het mooie: ik wil elke seconde zien hoe de array wordt gesorteerd.
Elke loop van het sorteer algoritme levert een array op die weer een stukje verder gesorteerd is :9 .

Deze array stuur ik elke itteratie van de loop naar de GUI.

stukje 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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.awt.*;
import javax.swing.JPanel;

public class BarChart extends JPanel {
    /**Sample data, and data names*/
    private int[] dataValue = new int[1];
    
    private Color[] colors = {Color.red, Color.yellow, Color.green,
    Color.blue, Color.cyan, Color.magenta, Color.orange, Color.pink,
    Color.darkGray};
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        if (dataValue == null) return;
        
        // Find the maximum value in the data
        double max = dataValue[0];
        for (int i=1; i<dataValue.length; i++) {
            max = Math.max(max, dataValue[i]);
        }
        int barWidth = (int)((getWidth() - 15.0)/dataValue.length - 9);
        if (barWidth <1){
            barWidth = 1;
        }
        // The height of the bar.
        int maxBarHeight = getHeight() - 30;
        
        g.drawLine(5, getHeight()-10, getWidth()-5, getHeight()-10);
        
        int x = 15;
        
        for (int i=0; i<dataValue.length; i++) {
            g.setColor(colors[i%colors.length]);
            int newHeight = (int)(maxBarHeight*dataValue[i]/max);
            int y = getHeight()-10-newHeight;
            g.fillRect(x, y, barWidth, newHeight);
            g.setColor(Color.black);
          }
            x += barWidth + 9;
        }
        
    }
    
    /**Set data*/
    public void setData(int[] dataValue) {
        
        this.dataValue = dataValue;
        repaint();
        
        try {
            Thread.sleep(20);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
    }   
}


De methode setData roep ik aan vanaf mijn sortclass en daarin doe ik een repaint(), echter de repaint wordt pas uitgevoerd als de loop geweest is.
Ok, dit staat in de API, echter, ik wil dat hij gelijk getekend wordt.

Ik heb al eindeloos het web rond gespeurt en verschillende dingen geprobeerd zoals
Java:
1
2
3
4
paint(GetGraphics());
paintComponent(GetGraphics())
update(GetGraphics());
revalidate();


Het enige wat ik steeds krijg is een x aantal seconden niets en dan wordt het eindresultaat van mijn sorteer algoritme gegeven.

Wie ow wie kan mij vertellen hoe ik die grafiek meteen kan tekenen ipv op het laatst?

Hi, I'm a signature virus. Put me in your signature to help me spread.


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
Je kunt een redelijk eenvoudige inner class maken die de Thread klasse extend: een Thread, in het kort, is een mini-proces in je programma die 'naast' je programma draait. Kijk bijvoorbeeld hier voor info.

Na je laatste method in die grafiek klasse kun je, bijvoorbeeld, het volgende stukkie code plakken:


Java:
1
2
3
4
5
6
7
8
9
10
private class RepaintThread extends Thread {
    static boolean run = true; // deze op false zetten om thread te stoppen - zet op false voordat of tijdens dat je het programma beeindigt.
    public void Run() {
        repaint(); // repaint methode van klasse waarin deze RepaintThread gedefinieerd wordt aanroepen
        try {
            Thread.sleep(1000); // thread 1000 ms laten slapen
        }
         catch (InterruptedException ie) { }
     }
}

  • L01
  • Registratie: December 2003
  • Laatst online: 17-11 21:53
Bedankt voor je reactie. :)

Hoe moet ik deze class precies aanroepen dan?

Java:
1
2
3
4
5
public void setData(int[] dataValue) {
        
        this.dataValue = dataValue;
        (new RepaintThread()).start(); // <---- zo ?
    }

Hi, I'm a signature virus. Put me in your signature to help me spread.


  • bloody
  • Registratie: Juni 1999
  • Laatst online: 13:42

bloody

0.000 KB!!

Dat gaat ook niet werken.

Probeer paintImmediately(args) die verhelpt je probleem.

nope


  • L01
  • Registratie: December 2003
  • Laatst online: 17-11 21:53
Kan je uitleggen hoe dat precies moet want met die methode moeten er argumeneten meegegeven worden ( een rectangle of (int x int y int w int h).

Geen idee wat die ractangle is en met die intx etc kan ik ook niet veel..

Hi, I'm a signature virus. Put me in your signature to help me spread.


  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 13:32
Ik heb 'm nog nooit gebruikt, maar ik geloof dat SwingWorker (aanwezig sinds Java SE 6) bedoeld is hiervoor. De JavaDocs geven genoeg informatie over het gebruik van deze API en er zijn allerlei verwijzingen naar artikelen te vinden. Ik hoop dat je wat kunt met deze informatie :).

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • DarkSilence
  • Registratie: December 2002
  • Laatst online: 06-07 20:28

DarkSilence

W3designer.nl

Je moet zorgen zoals eerder al gezegd dat sorteren en painten van window in 2 verschillende threads gebeurt. Anders wacht het repainten tot het sorteren klaar is en dat is net niet de bedoeling.

Het is ook verstandig om een sleep in elke interatie te doen anders is er ook niks te zien dan gaat het te snel en kan het repaint proces dat ook niet aan.

Suc6 ermee!

W3designer.nl


  • L01
  • Registratie: December 2003
  • Laatst online: 17-11 21:53
Ja, klopt die sleep heb ik er in zitten.

Als ik het goed begrijp wordt er automatisch een thread aangemaakt als ik het programma start? Dus nu alleen nog een thread voor dat painten, kan dat op de manier zoals YopY al eerder aangaf?

Hi, I'm a signature virus. Put me in your signature to help me spread.

Pagina: 1