/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Swing programmering - draw og repaint
Fra : Jens Pedersen


Dato : 16-01-05 15:41

Hej Ng,

Vi er en gruppe, der skriver en opgave med henblik på at lære swing pakken
at kende.
Vi er i midlertid stødt på et problem, som jeg kort vil prøve at forklare.

Vi vil oprette et histogram - en slags søjlediagram, så vi har oprettet en
klasse, der udvider JPanel klassen. Dette panel indsættes i et objekt, der
udvider JFrame, kaldet
MainFrame. Histogrammet afhænger af en objekttype, vi har kaldt
SensorAdministration, som ind i mellem bliver opdateret med nye data. Derfor
skal histogrammet også opdateres, hvilket gerne skulle indebære, at nye data
lægges i histogrammet, hvorefter det repaintes.

Problemet er nu: Vi opretter et histogram objekt, hvor der lægges nogle tal
ind i hist arrayet. Dette virker fint, og hvis vi sætter en
System.out.printnl ind i konstruktøren, kan vi se, det også er de rigtige
værdier. Vi bruger nu UpdateHistogram(), som går ind og opretter et nyt
histogram objekt - dog med de samme data - og repainter. Men når
paintComponent metoden bliver kaldt, henter den kun 0'er ud af hist arrayet.
Endvidere ser det ikke ud til, at paintComponent metoden, bliver kaldt som
forventet ved repaint() i UpdateHistogram metoden - men ved at flytte
vinduet ud og ind af skærmen kan vi fremprovokere en repaint() og derved se,
tingene ikke virker.

Hvad kan dette skyldes? Vi er helt blanke.

Vi har prøvet at skitsere de brugte klasser nedenunder. Det er meget
forkortede udgaver, men de centrale ting er beholdt. Vi håber, der findes et
svar derude.

På forhånd tak

Jens Pedersen og gruppe




Histogram.java: (meget forkortet)

public class Histogram extends JPanel {

private int[] hist;
private final int NUMBER_OF_COLS = 5;

// SensorAdministration er et objekt, der afgør
// hvad, der skal lægges ind i hist - s giver adgang
// til en ArrayList.

public Histogram(SensorAdministration s) {

hist = new int[NUMBER_OF_COLS]

// Her følger nogle beregninger, der indsætter værdier
// i hist arrayet - hvilket virker fint.

}

public void paintComponent(Graphics g) {

// Overskriver JPanels paintComponent metode
super.paintComponent(g);

for(int i = 0; i<hist.lenght; i++) {
// Tegner en søjle med en højde, der svarer
// til k*hist[i], hvor k er en skaleringsfaktor
// og rykker et stykke hen ad x-aksen, hvor den
// næste søjle skal tegnes.
}
}
}


MainFrame.java (meget forkortet)

public class MainFrame extends JFrame {

private Histogram histogram;

public MainFrame() {

// Henter et SensorAdministration objekt
SensorAdministration s = etobjekt.getSensAdmin();
histogram = new Histogram(s);
this.add(histogram);
}

public void UpdateHistogram()
{
histogram = new Histogram(henter nyt SensorAdministration objekt);
histogram.repaint();
}
}



 
 
Filip Larsen (17-01-2005)
Kommentar
Fra : Filip Larsen


Dato : 17-01-05 03:10

Jens Pedersen skrev

> Vi bruger nu UpdateHistogram(), som går ind og opretter et nyt
> histogram objekt - dog med de samme data - og repainter.

Det nye Histogram objekt der dannes i UpdateHistogram er ikke indsat i
JFrame'en, og derfor er det selvfølgelig også nytteløst at kalde repaint
på det.

Jeg vil anbefale, at I ikke laver noget nyt Histogram objekt, men
istedet laver en metode i Histogram der sætter histogrammets data ud fra
et SensorAdministrations objekt. Denne metode kan så bruge fra både
konstruktøren og under update, fx:

public class Histogram extends JPanel {
private int hist[] = new int[NUMBER_OF_COLS];

public Histogram(SensorAdministration sa) {
setSensorAdministration(sa);
}

public void setSensorAdministration(SensorAdministration sa) {
// hist array updateres.
repaint();
}
}

Updateringen i MainFrame kan så skrives:

public void updateHistogram() {
histogram.setSensorAdministration(nytSa);
}



Mvh,
--
Filip Larsen



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste