Samspil mellem add(Component) og paintComponent
Jeg forsøger at lave x antal tidslinjer under hinanden (altså et Gantt diagram), hvor man kan trække i de enderne på de enkelte tidslinjer. Bagved linjerne har jeg et gitterværk for at synliggøre, hvor langt linjerne er fra hinanden i tid – og for blot at skille disse linjer fra hinanden.Mit problem er, at tidslinjerne forsvinder, når jeg resizer Framen - og nogle gange er de der slet ikke, når jeg starter applikationen op.
Jeg har bl.a. følgende klasser:
- Frame (der nedarver fra JFrame)
- DrawRectanglePanel (der nedarver fra JPanel)
Jeg har en mistanke om, at der er noget galt i samspillet mellem de to klasser - eller rettere i deres måde at bruge Java 2D API, idet jeg "blander" brugen af paintComponent i DrawRectanglePanel til at lave det bagvedliggende gitter, mens jeg brugen JFrames nedarvede add metode til at tegne tidslinjer (ved at tilføje JLabels).
Nedenfor har jeg pastet de to klasser
Frame ser således ud:
import javax.swing.JFrame;
public class Frame extends JFrame{
private long start = 1228137824746L;
private long stop = 1228238836573L;
public Frame(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(1200,200);
DrawRectanglePanel panel = new DrawRectanglePanel();
add(panel);
setVisible(true);
panel.addLabels(start, stop);
}
public static void main(String[] args) {
new Frame();
}
}
DrawRectanglePanel ser således ud:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class DrawRectanglePanel extends JPanel{
private int hourRectanglewidth = 50;
private int timelineHeight = 30;
private int posOffset = 20;
public DrawRectanglePanel() {
this.setLayout(new FlowLayout());
}
public void paintComponent(Graphics g) {
super.paintComponents(g);
int x=posOffset;
for(int i = 0; i <= 30; i++) {
g.setColor(Color.blue);
g.drawRect(x, 20, hourRectanglewidth-2, timelineHeight);
x += hourRectanglewidth-2;
}
x = posOffset-1;
for(int i = 0; i <= 31; i++) {
int time;
if(i<=24){
time = i;
g.setColor(Color.black);
}else{
time = i-24;
g.setColor(Color.RED);
}
g.drawString("" + time, x, 12);
x += hourRectanglewidth-2;
}
}
public void addLabels(long start, long stop){
int startHour = getHour(start);
int startMinute = (startHour*60) + getMinutes(start);
int stopHour = getHour(stop);
int stopMinute = (stopHour*60) + getMinutes(stop);
Vector<JLabel> measurement = new Measurement(hourRectanglewidth,start, stop).setMeasurementLabel(startMinute, stopMinute);
this.add(measurement.elementAt(Measurement.FLOATING_LABEL));
this.add(measurement.elementAt(Measurement.MEASUREMENT_LABEL));
this.add(measurement.elementAt(Measurement.END_LABEL));
this.add(measurement.elementAt(Measurement.BEGINNING_LABEL));
}
public int getMinutes(long time){
Calendar c = new GregorianCalendar();
c.setTime(new Date(time));
return c.get(Calendar.MINUTE);
}
public int getHour(long time){
Calendar c = new GregorianCalendar();
c.setTime(new Date(time));
return c.get(Calendar.HOUR_OF_DAY);
}
public int getPosOffset(){
return posOffset;
}
}