[java] in JScrollPane tekenen

Pagina: 1
Acties:

  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 17:23

Tjeerd

Be Original, Be Yourself.

Topicstarter
Ik ben nog steeds bezig met m'n patientenprogje en dat werkt op zich prima, ik had eerst een CSV-bestand met 40 patienten, daar werd wat op berekent en dan krijg je een 40 bij 40 blokjespatroon (heatmap) van per blokje 15 pixels. Dus je krijgt gauw een scherm gevuld met 40x15 = 600 pixels. Dit tekende ik allemaal in een 'normaal' JPanel. Nu heb ik een ander CSV-bestand gekregen en daar staan 240 patienten in. Je raadt het al, dit betekent 240x15 pixels = 3600 pixels breed en hoog. Past niet binnen een normaal venster.

Het tekenen ging me ook niet echt snel genoeg, want hij leest dus ruim 240x240 velden in met waarden (en doet daar ook nog een berekening over). Zodra je met een ander Windows-venster over de JPanel heen gaat, wordt de paintComponent aangeroepen en gaat ie weer alle 240x240 vakjes opnieuw tekenen (+berekenen).
Op zo'n moment staat de applicatie 2 sec. ongeveer helemaal stil.
Binnen die paintComponent worden dus al die 240x240 velden doorlopen en getekent.

Belangrijk: Is het mogelijk om het plaatje 1x te laten tekenen en dat vervolgens in een soort van buffer op te slaan zodat ie in een keer de buffer opnieuw terugdumpt ipv alles opnieuw te berekenen en tekenen?

Minder belangrijk: nu wilde ik een JScrollPane gebruiken ipv een JPanel om daar binnen te tekenen, is het mogelijk om eerst alles in een aparte buffer te tekenen en die dan vervolgens binnen de JPanel te laten zien?

Ik heb het idee dat ik niet efficient bezig ben iig, misschien dat andere mensen mij kunnen verlichten met wat tips/hints.

update: ik heb toch wat gevonden, jpanel kan in een jscrollpane worden gebruikt, ga ik dat nu even verder uitzoeken; nu nog de vraag hoe ik efficienter kan tekenen ipv 2 sec applicatie-lockup :)

[ Voor 14% gewijzigd door Tjeerd op 25-05-2004 10:36 ]

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


Verwijderd

Je kan dubbelbuffering gebruiken.

Wat dit in feite doet is ipv rechtstreeks te painten naar je graphics ga je dit zelf beheren.

Wanneer je applicatie opstart ga je painten naar een zelfgemaakte graphics. Wanneer java dan paintcomponent oproept moet je gewoon jouw zelf gemaakte graphics painten. Deze techniek noemt dubbelbuffering. Zoek daar eens wat op in google.

Er zijn verschillende manieren om dit te implementeren. Ik heb volgende ooit gebruikt.
Java:
1
2
3
4
5
6
7
8
9
10
11
private Image buffer
public constructor(){
buffer = this.getGraphics.createImage();
}
public void teken(){
buffer.draw...
buffer.draw...
}
public void paintComponent(Graphics g){
g.drawimage(buffer);
}


Hier komt het ongeveer op neer! Hij tekent dus maar 1 keer ECHT en daarna gaat hij gewoon de buffer tekenen wanneer java dat wil (bij resize bvb)

  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 17:23

Tjeerd

Be Original, Be Yourself.

Topicstarter
Bedankt, kon het me trouwens nog wel herinneren van vroeger door zelf arrays te maken en die te swappen naar het videogeheugen op 0xa000. Alleen onder java kwam ik er niet direct uit, maar ik heb dat tekenen iig opgelost, beetje ruwweg geschetst:

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
class HeatmapPanel extends JPanel
{
private BufferedImage buffer;
private Graphics2D g2buffer;
private double berekening;

  public void setup_heatmap()
  {
    buffer = new BufferedImage(800,600, BufferedImage.TYPE_INT_RGB);
    g2buffer = buffer.createGraphics();
  
    //hier teken en bereken ik het plaatje
    g2buffer.setPaint(...) enzovoorts
    berekening = formule * x;
    g2buffer.draw...(berekening)
    g2buffer.draw...(berekening) 
  }

  paintComponent(Graphics g)
  {
    //bij updaten van venster, wordt gewoon de buffer teruggeschreven 
    //die bij het initialiseren van JPanel is gevuld met de tekening
    g.drawImage(buffer,0,0,this);
  }
}

Heerlijk snel nu :)

[ Voor 11% gewijzigd door Tjeerd op 25-05-2004 11:19 ]

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 17:23

Tjeerd

Be Original, Be Yourself.

Topicstarter
Nog even over over de JPanel binnen een JScrollPane. Om een of andere reden krijg ik dat nog niet voor elkaar. Ik teken nu nog steeds netjes in de JPanel. En het opzetten van het frame ziet er als volgt uit:

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
[klasse]
public HeatmapPanel panel = new HeatmapPanel();

    public HeatmapFrame()
    {
        Toolkit kit = Toolkit.getDefaultToolkit();
        Dimension screenSize = kit.getScreenSize();
        Image img = kit.getImage("icon.gif");
        setIconImage(img);
        setTitle("blaat");  
        
        buildMenu();                    
        
        int screenHeight = screenSize.height;
        int screenWidth = screenSize.width;         
        
        setLocation(100,100);   
        setSize(800,600);       
        
        contentPane = getContentPane();     
        
        JScrollPane jsp = new JScrollPane(panel);       
        
        temp = hm_fileopen.open();                              
        contentPane.add(jsp);       
        
        panel.Setup_Heatmap(10,10,temp,false);                          
    }

Grootte van frame is 800x600, vervolgens maak ik een JScrollPane object aan en voeg daar mijn panel -- waar ik dus de tekening in maak -- toe. Uiteindelijk moet dus de tekening binnen een standaard bijv. 800x600 panel getekend zijn en alles wat er niet op past moet via de JScrollPane naar toe te scrollen zijn.

Het probleem: ik krijg geen scrollbars te zien op deze manier, ik dacht dat ik eerst een JPanel moest aanmaken en deze toevoegen aan een JScrollPane. En uiteindelijk de JScrollPane toevoegen aan het frame. Maar dat werkt dus niet :?
Ik heb al verschillende manieren geprobeerd van toevoegen en volgordes.

[ Voor 4% gewijzigd door Tjeerd op 25-05-2004 12:50 ]

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:59

Robtimus

me Robtimus no like you

Misschien moet je de preferred size van je panel nog zetten. JScrolledPane gebruikt die geloof ik voor de scrollbars. Wat is de preferred size van je panel nu eigenlijk?
Java:
1
setPreferredSize(new Dimension(x, y));
Normaal gesproken wordt de preferred size berekent adhv de toegevoegde componenten. Nu zijn die er geloof ik niet, dus zal de preferred size niet je gewenste waarde hebben.

En gebruik je wel pack()?

[ Voor 32% gewijzigd door Robtimus op 25-05-2004 13:16 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 17:23

Tjeerd

Be Original, Be Yourself.

Topicstarter
Ik heb de setPreferredSize toegevoegd (ook al in andere topics tegengekomen).
Java:
1
2
3
4
5
6
7
8
9
        
    panel.setPreferredSize(new Dimension(500,500));     
    JScrollPane jsp = new JScrollPane(panel);           
    //jsp.add(panel);                       
    temp = hm_fileopen.open();                  
    
                contentPane.add(jsp);                   
    
                pack();

En mijn fout zat hem in dat ik 'maar' 500, 500 opgaf, ik heb nu 1500x1500 en krijg nu wel een scrollbar te zien. Wat een leipe fout 8)7.

[ Voor 54% gewijzigd door Tjeerd op 25-05-2004 13:45 ]

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:59

Robtimus

me Robtimus no like you

Waarom heb je een statische size? Met 240 patienten is volgens je eerste bericht de groote 3600x3600. Zou de preferred size dan niet net zo variabel moeten zijn als het aantal patienten?

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Tjeerd
  • Registratie: Oktober 1999
  • Laatst online: 17:23

Tjeerd

Be Original, Be Yourself.

Topicstarter
Dat klopt ja, dit was een test, ik moet nog een methode schrijven die dynamisch de preferredSize parameters meegeeft, afhankelijk van het aantal patienten.

Ik had trouwens een geheugenprobleem OutOfMemoryError omdat BufferedImage te groot werd, gelukkig met -Xmx128000000 kunnen oplossen :)

www.tjeerd.net - To repeat what others have said, requires education, to challenge it, requires brains.

Pagina: 1