Avatar billede it-dyret Nybegynder
27. januar 2009 - 15:32 Der er 4 kommentarer

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;
  }
}
Avatar billede gedfrik Nybegynder
30. januar 2009 - 14:58 #1
Et par rettelser til din kode før noget andet:

- husk at kalde pack() metoden i din JFrame sub-klasse.
- I din paintComponent overskrivning, skal du kalde super.paintComponent(g) og ikke super.paintComponents(g).

Gør det nogen forskel?
Avatar billede it-dyret Nybegynder
02. februar 2009 - 12:40 #2
Tak for input. Det gør desværre ingen forskel... andre forslag?
Avatar billede it-dyret Nybegynder
02. februar 2009 - 12:46 #3
Måske skal jeg lige nuancere min kommentar... Det ser ud til, at jeg ikke længere har et periodisk problem med, at tidslinjerne ikke er der, når jeg starter applikationen op. Dog forsvinder de konsekvent hver gang, at jeg resizer billedet.
Avatar billede it-dyret Nybegynder
02. februar 2009 - 12:46 #4
Og med billedet mener jeg framen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester