Graphics2D::draw(Rectangle.Float) wil niet tekenen.

Status
Niet open voor verdere reacties.

Arjan B

Gebruiker
Lid geworden
11 dec 2006
Berichten
364
Beste mensen van helpmij.nl,

Ik moet voor een schoolopdracht de visualisatie doen van een kaart. Ik lees een hele hoop aan punten in en teken tussen die punten lijntjes zodat ze de provincies vormen. Dit werkt allemaal zoals ik het wil.

Maar zodra ik dan de boundingbox van elke provincie wil gaan tekenen gaat er iets fout. Ik zal eerst wat code geven en dan uitleggen wat ik denk dat er fout gaat.

Panel.java:
Code:
public class Panel extends javax.swing.JFrame {

    Parser parser = new Parser();
    RegionVisSet regions;

    /** Creates new form Panel */
    public Panel() {
        initComponents();
        initAddedComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 420, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 322, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private class DrawingPanel extends JPanel {

        public DrawingPanel() {
            this.setBackground(Color.white); // set the background color to white
            this.setSize(Globals.windowWidth, Globals.windowHeight);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g.create();
            for (int i = 0; i < regions.getRegionCount(); i++) {
                g2d.setPaint(Color.black);
                regions.getRegion(i).draw(g2d);
                regions.getRegion(i).drawBoundingBox(g2d);
            }
        }
    }

    public void initAddedComponents() {
        DrawingPanel drawingPanel = new DrawingPanel();
        this.add(drawingPanel);
        RepaintManager.currentManager(drawingPanel).setDoubleBufferingEnabled(false);
        regions = parser.readFull("nl-provincies-minnumber-2200-2200");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                JFrame Panel = new Panel();
                Panel.setVisible(true);
                Insets insets = Panel.getInsets();
                Panel.setSize(insets.left + insets.right + Globals.windowWidth,
                        insets.top + insets.bottom + Globals.windowHeight);
            }
        });
    }

    ;
    // Variables declaration - do not modify                     
    // End of variables declaration                   
}

RegionVis.java:
Code:
public class RegionVis extends Region {

    private ArrayList<Polygon> polygons = new ArrayList<Polygon>();

    public RegionVis(String sLabel,Rectangle2D.Float rBoundingBox) {
        super(sLabel, rBoundingBox);
    }

    public ArrayList<Polygon> getRegion() {
        return polygons;
    }

    public Polygon getPolygon(int i) {
        return polygons.get(i);
    }

    public void addPolygon(Polygon p) {
        polygons.add(p);
    }

    public void draw(Graphics2D g2d) {
        for (int i = 0; i < polygons.size(); ++i) {
            polygons.get(i).draw(g2d);
        }
    }

    private Point2D.Float ConvertPoint(Point2D.Float p) {
        float x = p.x - Globals.überMinX;
        float y = p.y - Globals.überMinY;
        float xdif = Globals.überMaxX - Globals.überMinX;
        float ydif = Globals.überMaxY - Globals.überMinY;
        float dif = (xdif >= ydif ? xdif : ydif); // dif = min(xdif, ydif)
        Point2D.Float pp = new Point2D.Float();
        pp.x = x/dif*Globals.windowWidth;
        pp.y = Globals.windowHeight - y/dif*Globals.windowHeight;
        return pp;
    }


    public void drawBoundingBox(Graphics2D g2d) {
        Rectangle2D.Float rect = getBoundingBox();
        System.out.println(rect.toString());
        Point2D.Float topleft  = new Point2D.Float(rect.x, rect.y);
        Point2D.Float botright = new Point2D.Float(rect.x+rect.width, rect.y+rect.height);
        topleft  = ConvertPoint(topleft);
        botright = ConvertPoint(botright);
        rect.setRect(topleft.x, botright.y, botright.x-topleft.x, topleft.y-botright.y);
        g2d.draw(rect);
    }

    public int size() {
        return polygons.size();
    }
}

Globals.überMinX is de minimale x waarde van alle punten die de parser in heeft gelezen. Iets dergelijks geldt voor MinY, MaxX, MaxY.

Wat er nu fout gaat is, regions.getRegion(i).drawBoundingBox(g2d) heeft geen effect. Terwijl regions.getRegion(i).draw(g2d) wel tekent.
Wanneer ik een breakpoint wegzet en ga debuggen zie ik dat drawBoundingBox() 24 keer wordt aangeroepen in plaats van 12 (we gebruiken een kaart van Nederland).
De eerste 12 keer staan er netjes waardes tussen 0 en 800 in rect. De volgende 12 keer staat er totale onzin in rect (waardes als -1973944).

Heeft iemand enig idee waarom hij een keer teveel alle boundingboxes probeert te tekenen, waarom de tweede keer onzinwaardes in rect staan en waarom de eerste keer met de juiste waardes die vierkanten toch niet getekend worden?

Alvast bedankt,
Arjan
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan