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();
}
}
|