Avatar billede sluppermanden Nybegynder
13. august 2003 - 10:00 Der er 18 kommentarer og
1 løsning

Hvorfor kan jeg ikke se mit billede ?

Jeg er igang med at lave et program som skal tegne ruter.
Ideen er at man ligger et billede af et kort ind, og derefter skal man kun tegne ovenpå billedet.

Tegne funktionen virker, men jeg kan ikke se mit billede.

Her er min kode:

package Rutetest.draw;
import java.awt.*;
import javax.swing.*;

class Draw extends javax.swing.JFrame{

    public Draw() {
        initComponents();
        setSize(1200,800);
        setTitle("Rute");
    }
 
    private void initComponents() {
       
        this.getContentPane().setLayout(null);
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                punkter[antalPunkter] = evt.getPoint();
                drawCircle(evt);
                antalPunkter++;
            }
        });
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                drawMap();
            }
        });
        pack();
        repaint();
    }

    int antalPunkter=0;
    Point[] punkter = new Point[100];
    double distance = 0;
    String sti = "C:/Documents and Settings/6x108081/Dokumenter/JAVA/Rutetest/draw/";
   
//    Viser baggrunds kort
    private void drawMap(){
    Image image = (Image) createImage(1200,800);
    java.awt.Graphics gr = this.getGraphics();
    //java.awt.Graphics2D gr2 = (java.awt.Graphics2D)gr;
    ImageIcon i = new ImageIcon("Sti"+"Cykelkort.jpg");
    Image p = i.getImage();
    gr.drawImage(p,0,0,this);
    }

    private void drawCircle(java.awt.event.MouseEvent evt) {
        java.awt.Graphics g = this.getGraphics();
        java.awt.Graphics2D g2 = (java.awt.Graphics2D)g;
//      Tegner en prik hvor musen har klikket
        g2.setColor(java.awt.Color.RED);
        g2.fillOval(evt.getX()-3, evt.getY()-3, 6,6);
//      Tegner en streg til forrige punkt hvis der er et. 
        if (antalPunkter>0){
          g2.drawLine(evt.getX(), evt.getY(), punkter[antalPunkter-1].x,punkter[antalPunkter-1].y);
            double temp1= (punkter[antalPunkter-1].x-evt.getX())*(punkter[antalPunkter-1].x-evt.getX());
            double temp2= (punkter[antalPunkter-1].y-evt.getY())*(punkter[antalPunkter-1].y-evt.getY());
            if (temp1<0)
                temp1= temp1*(-1);
            if (temp2<0)
                temp2= temp2*(-1);
            double temp = temp1+temp2;
            distance = Math.sqrt(temp1+temp2)*0.028346*100;
            System.out.println(distance);
        }
    }
    private void exitForm(java.awt.event.WindowEvent evt) {System.exit(0);}
   
    public static void main(String args[]) { new Draw().show();  }}
Avatar billede sluppermanden Nybegynder
13. august 2003 - 10:29 #1
Og hvis man ikke gider læse det hele

addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                drawMap();
            }
        });
private void drawMap(){
    Image image = (Image) createImage(1200,800);
    java.awt.Graphics gr = this.getGraphics();
    ImageIcon i = new ImageIcon("Sti"+"Cykelkort.jpg");
    Image p = i.getImage();
    gr.drawImage(p,0,0,this);
    }
er det her et sted jeg tror problemet ligger
Avatar billede _carsten Nybegynder
13. august 2003 - 11:51 #2
Den er ihvertfald forkert

  ImageIcon i = new ImageIcon("Sti"+"Cykelkort.jpg");

Ret til
  ImageIcon i = new ImageIcon(Sti + "Cykelkort.jpg");
Avatar billede _carsten Nybegynder
13. august 2003 - 11:53 #3
Så vidt jeg lige kan se burde det virke nu !!
Avatar billede sluppermanden Nybegynder
13. august 2003 - 12:02 #4
Du er cool og jeg er en nar, selvfølgelig virker det nu, takker.
Avatar billede sluppermanden Nybegynder
13. august 2003 - 12:07 #5
Det eneste problem er at når jeg trykker udenfor billedet forsvinder billedet og min rute. Ved du hvorfor ?
Avatar billede _carsten Nybegynder
13. august 2003 - 12:24 #6
Det tror jeg, indsæt nedenstående metode i Draw classen

private void paintComponent(){
    drawMap();
    super.paint(getGraphics());
}
Avatar billede _carsten Nybegynder
13. august 2003 - 12:26 #7
Tjaa - og dog, din kode virker hos mig uanset om den indsættes eller ej
Avatar billede sluppermanden Nybegynder
13. august 2003 - 12:33 #8
Det virker stadig ikke, det er som om at der kun bliver tegnet i en buffer eller et eller andet.

Jeg tror problemet er at jeg ikke kan repainte da jeg ikke gemmer det jeg har tegnet nogen steder.
Avatar billede sluppermanden Nybegynder
13. august 2003 - 12:38 #9
Men hvis jeg f.eks minimere den og maksimere den igen bagefter forsvinder kortet og den rute jeg har tegnet.
Avatar billede sluppermanden Nybegynder
13. august 2003 - 12:40 #10
Hvis jeg nu laver punkterne som en klasse, sådan at hvert punkt tegner sig selv. Men det kræver at hele billedet skal tegnes igen, hvergang der laves et nyt punkt. Programmet ville blive en del langsomere.
Avatar billede _carsten Nybegynder
13. august 2003 - 14:06 #11
Den her virker, mener bare ikke den burde gøre det

Erstat paintComponent() med nedenstående:
public void paint(java.awt.Graphics g){
    super.paint(g); 
    drawMap();
}

Problemet er så dine punkter - ved ikke lige hvordan det kan løses nemt.
Men vil høre det hvis du får det løst.
Avatar billede sluppermanden Nybegynder
13. august 2003 - 14:23 #12
ok har det samme som dig, jeg arbejder lidt videre på punkterne.
Avatar billede sluppermanden Nybegynder
13. august 2003 - 15:05 #13
Så nu virker det. Den kommer med et par null pointer, men den laver det rigtigt nok. Lige med undtagelse af distance udregningen. Den bliver lidt fucked up pga. man tegner ruten flere gange.

Her er den.

Sluppermanden;

package Rutetest.draw;
import java.awt.*;
import javax.swing.*;

class Draw extends javax.swing.JFrame{

    public Draw() {
        initComponents();
        setSize(1200,800);
        setTitle("Rute");
    }
 
    public void initComponents() {
        this.getContentPane().setLayout(null);
        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                punkter[antalPunkter] = evt.getPoint();
                drawCircle(punkter[antalPunkter].x,punkter[antalPunkter].y,antalPunkter);
                antalPunkter++;
               
            }
        });
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                drawMap();
            }
        });
        pack();
        repaint();
    }

    int antalPunkter=0;
    Point[] punkter = new Point[100];
    double distance = 0;
    String sti = "C:/Documents and Settings/6x108081/Dokumenter/JAVA/Rutetest/draw/";
   
    public void paint(java.awt.Graphics g){
      super.paint(g); 
      drawMap();
      for (int i=0;i <punkter.length;i++)
      drawCircle(punkter[i].x,punkter[i].y,i);
    }

//    Viser baggrunds kort
    private void drawMap(){
    Image image = (Image) createImage(1200,800);
    java.awt.Graphics gr = this.getGraphics();
    //java.awt.Graphics2D gr2 = (java.awt.Graphics2D)gr;
    ImageIcon i = new ImageIcon(sti + "Cykelkort2.jpg");
    Image p = i.getImage();
    gr.drawImage(p,0,0,this);
    }

    private void drawCircle(int x,int y,int nr) {
        java.awt.Graphics g = this.getGraphics();
        java.awt.Graphics2D g2 = (java.awt.Graphics2D)g;
//      Tegner en prik hvor musen har klikket
        g2.setColor(java.awt.Color.RED);
        g2.fillOval(x-3, y-3, 6,6);
//      Tegner en streg til forrige punkt hvis der er et. 
        if (nr>0){
          g2.drawLine(x, y, punkter[nr-1].x,punkter[nr-1].y);
            double temp1= (punkter[nr-1].x-x)*(punkter[nr-1].x-x);
            double temp2= (punkter[nr-1].y-y)*(punkter[nr-1].y-y);
            if (temp1<0)
                temp1= temp1*(-1);
            if (temp2<0)
                temp2= temp2*(-1);
            double temp = temp1+temp2;
            distance = distance + Math.sqrt(temp1+temp2)*0.0175;//0.028346; //afhænger af målestokforhold
            System.out.println(distance);
        }
    }
    private void exitForm(java.awt.event.WindowEvent evt) {System.exit(0);}
   
    public static void main(String args[]) { new Draw().show();  }}
Avatar billede _carsten Nybegynder
13. august 2003 - 15:24 #14
Okay - vi må arbejde videre !

Vender nok ikke tilbage før i morgen
Avatar billede _carsten Nybegynder
14. august 2003 - 14:00 #15
Så lykkedes det endelig, men jeg måtte starte på frisk.

Husk lige at rette stien til dit baggrundsbillede (i bunden af classen)


public class DrawTest extends javax.swing.JFrame {
   
    public DrawTest() {
        initComponents();
        setExtendedState(MAXIMIZED_BOTH);
        show();
    }
   

    private void initComponents() {

        addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                tegnStart(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                tegnStop(evt);
            }
        });
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                exitForm(evt);
            }
        });

        pack();
    }

    private void tegnStop(java.awt.event.MouseEvent evt) {
        stopX = evt.getX();
        stopY = evt.getY();

        repaint();
    }

    private void tegnStart(java.awt.event.MouseEvent evt) {
        if(startX == 0 && startY == 0){
            startX = evt.getX();
            startY = evt.getY();
        }
        else{
            startX = stopX;
            startY = stopY;
        }
    }
   
    private void exitForm(java.awt.event.WindowEvent evt) {
        System.exit(0);
    }
   
    public void paint(java.awt.Graphics g){
     
      if(offscreen == null) {
          offscreen = (java.awt.image.BufferedImage)createImage(
            this.getWidth(), this.getHeight());

            g2d = offscreen.createGraphics();
            g2d.drawImage(addMyBackground(), 0, 0, null);
      }

      g2d.setColor(java.awt.Color.RED);
      g2d.fillOval(stopX -3, stopY -3, 6,6);
      g2d.drawLine(startX, startY, stopX, stopY);
     
      g.drawImage(offscreen, 0, 0, this);
    }
       
    private java.awt.Image addMyBackground(){
      javax.swing.ImageIcon i = new javax.swing.ImageIcon(sti);
        java.awt.Image p = i.getImage();
        return p;
    }
                       
    public static void main(String args[]) {
        new DrawTest();
    }

    int startX = 0, startY = 0, stopX = 0, stopY = 0;
    java.awt.image.BufferedImage offscreen;
    java.awt.Graphics2D g2d;
    String sti = "INDSÆT STIEN TIL DIT BAGGRUNDSBILLEDE";
}
Avatar billede sluppermanden Nybegynder
14. august 2003 - 21:11 #16
Ja det ser jo meget pænt ud, men du gemmer ikke punkterne så man kan skal starte forfra hvis man laver en fejl.
Ideen er at det skal udbygges med en fortryd knap, et par scrollbare og et sted man kan indtaste målestokforholdet på billedet. Evt også en knap hvor man scanner et billede.
Avatar billede _carsten Nybegynder
14. august 2003 - 21:23 #17
Ja, se det meldte din historie jo ikke noget om, før nu!

Spørmålet er så hvor mange gange skal man kunne fortryde, for det
kan jo blandt andet laves ved at have flere "offscreen images"
sådan at du hver gang der tegnes, flyttes det bageste images frem
og tegne arbejdet foregår så der - men du er jo stort set selv færdig
med gemme funktionen, så det må vel bare være at køre videre derfra.
Jeg har kun lavet så vinduet kan minimeres og maksimeres.
Avatar billede sluppermanden Nybegynder
14. august 2003 - 21:28 #18
Men det fungere jo også optimalt.
hehe...
Avatar billede sluppermanden Nybegynder
14. august 2003 - 21:31 #19
Jeg har prøvet ligge punktet i klasse for sig. Jeg har dog ikke testet det endnu.

import java.awt.*;

public class Punkt {
   
    private int x=0;
    private int y=0;
    private Punkt last=null;
    /** Creates a new instance of Punkt */
    public Punkt(int xk, int yk, Punkt pLast) {
    x=xk;
    y=yk;
    last = pLast;
    }
   
    public void paint(Graphics g) {
        g.setColor(java.awt.Color.BLUE);
        g.fillOval(x-3, y-3, 6,6);
//      Tegner en streg til forrige punkt hvis der er et. 
        if (last!=null)
          g.drawLine(x, y, last.getX(), last.getY());
    }
   
    public double getDist(double målestok){
        double temp1= (last.getX()-x)*(last.getX()-x);
        double temp2= (last.getY()-y)*(last.getY()-y);
            if (temp1<0)
                temp1= temp1*(-1);
            if (temp2<0)
                temp2= temp2*(-1);
            double temp = temp1+temp2;
            double distance = Math.sqrt(temp1+temp2)*målestok;
            return distance;
        }
   
    public int getX(){return x;}
    public int getY(){return y;}
    public Punkt getPunkt(){return this;}
}
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
Kategori
Kurser inden for grundlæggende programmering

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