Avatar billede netspinner Nybegynder
02. juni 2004 - 20:39 Der er 10 kommentarer og
1 løsning

Tegne simpel grafik i Applet

Hej alle, jeg sidder og lægger sidste hånd på et af mine eksamensprojekter, men har svært ved at få tegnet noget grafik. Sagen er at jeg udvikler en BMI-beregner som en applet, der skal være i stand til at tegne en figur for undervægtighed, overvægtighed etc. Dvs. hvis BMI-tallet klassificeres som overvægtighed, så skal der f.eks. tegnes en fyldt ellipse i en canvas etc. Håber der er nogen der kan give en løsning på dette..... en virkelig god løsning giver jeg 60 point for!

Her er min kode:

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.text.*;
//import java.applet.Applet.*;
import javax.swing.*;

public class BMI extends Applet implements ActionListener {
   
    private TextField højdeFelt;
    private TextField vægtFelt;
    Label meddel1, meddel2, omdømme;
    private Image vægtklasse;

    public void init () { //Initialiserer GUI
        setLayout(new GridLayout(3,1)); //Som LayoutManager bruger vi GridLayout

      // setBackground(new Color(51,51,51)); //Sort
      setBackground(Color.white);
        setForeground(new Color(255,153,0)); //Orange

        Panel lp = new Panel();
        Panel vp = new Panel();
        Panel mp = new Panel();

        højdeFelt = new TextField(4);
        vægtFelt = new TextField(3);
        lp.add(new Label("Højde i meter (fx 1.82):"));
        lp.add(højdeFelt);

        vp.add(new Label("Vægt i kilo:"));
        vp.add(vægtFelt);
        højdeFelt.addActionListener(this);
        vægtFelt.addActionListener(this);

        meddel1 = new Label("Skriv din højde og vægt i tekstfelterne!");
        meddel2 = new Label("BMI-værdien og et udsagn udregnes og udskrives");
        //omdome = new Label();
        //add(omdome);
        mp.add(meddel1); mp.add(meddel2);

        add(lp); add(vp); add(mp);

        play(getDocumentBase(),"BlueDust.au"); //Afspil lyd ved opstart
        vægtklasse = getImage(getCodeBase(),"nok1.jpg");
    }
   
    void SetUpMainMenu()
    {
        MenuBar theMenuBar;
        Menu theMainMenu;
       
        theMenuBar = new MenuBar();
        theMainMenu = new Menu("Print");
       
        theMainMenu.add(new MenuItem("Hi There!"));
        theMainMenu.add(new MenuItem("Kick Me!"));
        theMainMenu.add(new MenuItem("-"));
        theMainMenu.add(new MenuItem("Exit"));
        theMenuBar.add(theMainMenu);
    }
 

    public void actionPerformed (ActionEvent e) {
    double højde =0, vægt = 0;
    try {
        højde = Double.valueOf(højdeFelt.getText()).doubleValue();
        vægt = Double.valueOf(vægtFelt.getText()).doubleValue();
        double bmi = vægt/(højde*højde);
        String omdømme = "";

        if (bmi < 18.5) {
        omdømme = "undervægtig";
                    meddel2.setForeground(Color.red);    //Undervægtig:      rød
            play(getDocumentBase(),"BlueDust.au");
            /*g.setColor(Color.red);
            g.drawOval(55,55,55,55);
            g.setColor(Color.blue);*/
        }
        else if (bmi < 25) {
            meddel2.setForeground(Color.green);  //Normalvægt:      grøn
            omdømme = "normalvægt";
        }
        else if (bmi < 30) {
            omdømme = "overvægtig";
            meddel2.setForeground(Color.yellow); //Overvægtig:      gul
            play(getCodeBase(),"BlueDust.au"); //afspil lyd ved overvægtighed
        }
        else {
            omdømme = "SVÆRT overvægtig";
            meddel2.setForeground(Color.red);    //Svært overvægtig: rød
            // omdome.setForeground(new Color(255,0,0)); //Farv rød
            //omdome.setText("EKSTREM OVERVÆGT");
        NumberFormat nf = NumberFormat.getInstance();
        nf.setMaximumFractionDigits(1);
        meddel1.setText("Dit BMI er " + nf.format(bmi));
        meddel2.setText("hvilket betyder " + omdømme); //udskriv omdømmet
    }
}

    //Tag højde for hvis brugeren har indtastet bogstaver i stedet for tal, eller helt undlader at taste i felterne
    catch (NumberFormatException ex) {
        meddel1.setText("Fejlagtig indtastning, forsøg igen!");
        meddel2.setText("");
    }
}
    /*public void paint(Graphics g) {
        g.drawImage(baggrund, 0, 25, this);
    }*/
   
    /*public void undervægtig(Graphics g) {
        g.drawRect(40,5,5,40);
    }*/

    private void sovSødt(int x) {
        try { Thread.sleep(x); } catch (InterruptedException e) {}
    }
}
Avatar billede _carsten Nybegynder
02. juni 2004 - 21:52 #1
Kan ikke lige finde hvor og hvordan der skal tegnes, så her er din egen klasse med nogle rettelser og et forslag til en elipse

Prøv med højde 1.70 og vægt 45 kg rimelig underernæret
1.70 og vægt 90 = en bolle

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.text.*;
//import java.applet.Applet.*;
import javax.swing.*;

public class BMI extends Applet implements ActionListener {
   
    private TextField højdeFelt;
    private TextField vægtFelt;
    Label meddel1, meddel2, omdømme;
    private Image vægtklasse;
    Panel lp = new Panel();      ///  instancevariable i stedet for
    Panel vp = new Panel();
    Panel mp = new Panel();
   
    public void init () { //Initialiserer GUI
        setLayout(new GridLayout(3,1)); //Som LayoutManager bruger vi GridLayout

      // setBackground(new Color(51,51,51)); //Sort
      setBackground(Color.white);
        setForeground(new Color(255,153,0)); //Orange

       

        højdeFelt = new TextField(4);
        vægtFelt = new TextField(3);
        lp.add(new Label("Højde i meter (fx 1.82):"));
        lp.add(højdeFelt);

        vp.add(new Label("Vægt i kilo:"));
        vp.add(vægtFelt);
        højdeFelt.addActionListener(this);
        vægtFelt.addActionListener(this);

        meddel1 = new Label("Skriv din højde og vægt i tekstfelterne!");
        meddel2 = new Label("BMI-værdien og et udsagn udregnes og udskrives");
        //omdome = new Label();
        //add(omdome);
        mp.add(meddel1); mp.add(meddel2);

        add(lp); add(vp); add(mp);

        play(getDocumentBase(),"BlueDust.au"); //Afspil lyd ved opstart
        vægtklasse = getImage(getCodeBase(),"nok1.jpg");
    }
   
    void SetUpMainMenu()
    {
        MenuBar theMenuBar;
        Menu theMainMenu;
       
        theMenuBar = new MenuBar();
        theMainMenu = new Menu("Print");
       
        theMainMenu.add(new MenuItem("Hi There!"));
        theMainMenu.add(new MenuItem("Kick Me!"));
        theMainMenu.add(new MenuItem("-"));
        theMainMenu.add(new MenuItem("Exit"));
        theMenuBar.add(theMainMenu);
    }
 

    public void actionPerformed (ActionEvent e) {
    double højde =0, vægt = 0;
    try {
        højde = Double.valueOf(højdeFelt.getText()).doubleValue();
        vægt = Double.valueOf(vægtFelt.getText()).doubleValue();
        double bmi = vægt/(højde*højde);
        String omdømme = "";

        if (bmi < 18.5) {
        omdømme = "undervægtig";
                    meddel2.setForeground(Color.red);    //Undervægtig:      rød
            play(getDocumentBase(),"BlueDust.au");
            /*g.setColor(Color.red);
            g.drawOval(55,55,55,55);
            g.setColor(Color.blue);*/
        }
        else if (bmi > 18.4 && bmi < 25) {
            meddel2.setForeground(Color.green);  //Normalvægt:      grøn
            omdømme = "normalvægt";
        }
        else if (bmi >= 25 && bmi < 30) {
            omdømme = "overvægtig";
            meddel2.setForeground(Color.yellow); //Overvægtig:      gul
            play(getCodeBase(),"BlueDust.au"); //afspil lyd ved overvægtighed
        }
        else {
            omdømme = "SVÆRT overvægtig";
            meddel2.setForeground(Color.red);    //Svært overvægtig: rød
            // omdome.setForeground(new Color(255,0,0)); //Farv rød
            //omdome.setText("EKSTREM OVERVÆGT");
        }
        NumberFormat nf = NumberFormat.getInstance();
        nf.setMaximumFractionDigits(1);
        meddel1.setText("Dit BMI er " + nf.format(bmi));
        meddel2.setText("hvilket betyder " + omdømme); //udskriv omdømmet

       
        Graphics g = vp.getGraphics();
        vp.update(g);
        g.setColor(Color.red);
        int width = (int)bmi *2;
        int x = vp.getWidth() - 50 - (width / 2);
        g.fillOval(x, 0, width , vp.getHeight());       
}

    //Tag højde for hvis brugeren har indtastet bogstaver i stedet for tal, eller helt undlader at taste i felterne
    catch (NumberFormatException ex) {
        Graphics g = vp.getGraphics();
        vp.update(g);
        meddel1.setText("Fejlagtig indtastning, forsøg igen!");
        meddel2.setText("");
    }
}

    /*public void paint(Graphics g) {
        g.drawImage(baggrund, 0, 25, this);
    }*/
   
    /*public void undervægtig(Graphics g) {
        g.drawRect(40,5,5,40);
    }*/


    private void sovSødt(int x) {
        try { Thread.sleep(x); } catch (InterruptedException e) {}
    }
}
Avatar billede netspinner Nybegynder
02. juni 2004 - 23:38 #2
Mange tak for den hurtige respons!
Nu er det ikke lige grafik i Java jeg er hård til, så mit ønske er egentlig at ellipsen ikke ændres i størrelse alt efter hvor høj el. lav BMI-tallet er. Mit ønske er nogle statiske figurer, dvs. en ellipse for overvægt, rektangel for normalvægt, bolle for svært overvægtig... kan du (Carsten) / I det? Se i øvrigt bort fra menu-koden. Måske det ville være lettere i en JApplet?
Avatar billede _carsten Nybegynder
03. juni 2004 - 07:57 #3
Så retter du bare til nedenstående

    Graphics g = vp.getGraphics();
    vp.update(g);
    int x = vp.getWidth() - 80
    int y = ( vp.getHeight() / 2 ) - 25;
    g.setColor(Color.red);
   
        if (bmi < 18.5) {
        omdømme = "undervægtig";
                    meddel2.setForeground(Color.red);    //Undervægtig:      rød
            play(getDocumentBase(),"BlueDust.au");
           
        }
        else if (bmi > 18.4 && bmi < 25) {
            meddel2.setForeground(Color.green);  //Normalvægt:      grøn
            omdømme = "normalvægt";
            g.fillRect(x ,y , 50, 50);
        }
        else if (bmi >= 25 && bmi < 30) {
            omdømme = "overvægtig";
            meddel2.setForeground(Color.yellow); //Overvægtig:      gul
            play(getCodeBase(),"BlueDust.au"); //afspil lyd ved overvægtighed
            g.fillOval(x, y, 25,50);
        }
        else {
            omdømme = "SVÆRT overvægtig";
            meddel2.setForeground(Color.red);    //Svært overvægtig: rød
            // omdome.setForeground(new Color(255,0,0)); //Farv rød
            //omdome.setText("EKSTREM OVERVÆGT");
            g.fillOval(x, y, 50,50);
        }
        NumberFormat nf = NumberFormat.getInstance();
        nf.setMaximumFractionDigits(1);
        meddel1.setText("Dit BMI er " + nf.format(bmi));
        meddel2.setText("hvilket betyder " + omdømme); //udskriv omdømmet
Avatar billede netspinner Nybegynder
03. juni 2004 - 08:28 #4
Carsten - mange tak!
Ved du om det er simpelt at lave en dialog (eller andet), der starter med at vise figurerne for brugeren, så denne ved hvad de betyder?
--
Du får dine point
Avatar billede _carsten Nybegynder
03. juni 2004 - 09:37 #5
Du kan bruge en JDialog = nedenstående klasse

Som sidste linie i din init() tilføjer du: new Figurer(this, true).show();
gør at dialogen vises når din applet initieres


public class Figurer extends javax.swing.JDialog {
   
    public Figurer(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        setSize(300, 300);
    }

    private void initComponents() {
        jButton1 = new javax.swing.JButton();
        panel = new javax.swing.JPanel();

        setTitle("Symboler");
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        jButton1.setText("Luk");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                luk(evt);
            }
        });

        getContentPane().add(jButton1, java.awt.BorderLayout.SOUTH);

        getContentPane().add(panel, java.awt.BorderLayout.CENTER);

        pack();
    }

    private void luk(java.awt.event.ActionEvent evt) {
        dispose();
    }
   
    private void visFigurer(){
        Graphics g = panel.getGraphics();
        g.setColor(Color.red);
        g.fillRect(25, 25, 50, 50);
        g.fillOval(25, 100, 25, 50);
        g.fillOval(25, 175, 50, 50);
       
        g.setColor(Color.black);
        g.drawString("Normalvægt", 100, 50);
        g.drawString("Overvægtig", 100, 125);
        g.drawString("Svært overvægtig", 100, 200);
    }
   
    public void paint(Graphics g){
      super.paint(g);
      visFigurer();
    }
   
    public static void main(String args[]) {
        new Figurer(new javax.swing.JFrame(), true).show();
    }

    private javax.swing.JButton jButton1;
    private javax.swing.JPanel panel;   
}
Avatar billede netspinner Nybegynder
03. juni 2004 - 09:59 #6
Tusinde tak!!
Jeg kan dog imidlertid ikke få den linie i init() til at fungere...?
Er det muligt du kan knytte kommentarer til den klasse du lige har givet mig?
:-)
Håber ikke det er til for meget besvær...
Avatar billede netspinner Nybegynder
03. juni 2004 - 10:01 #7
For god ordens skyld, så melder den denne fejl:

"cannot resolve symbol - constructor Figurer(BMI,boolean)
Avatar billede netspinner Nybegynder
03. juni 2004 - 10:03 #8
Lige meget... jeg har løst det!
Men hvis du stadig har lyst til at udkommentere Figurer-klassen, vil jeg være en lykkelig mand :-)
Avatar billede _carsten Nybegynder
03. juni 2004 - 10:57 #9
Selvfølgelig - du har ret, den vil give fejl da det er en applet

Sidste linie i init() skal se sådan ud
        new Figurer(JOptionPane.getFrameForComponent(this), true).show();

Jeg ved ikke hvad jeg skal kommentere i Figurer, såååååååååh noget a la

// Tegner figurer og skriver text
private void visFigurer(){

// Overrider paint, tegner appletten og afvikler metoden visFigurer()
public void paint(Graphics g){

Og så er der vel ikke mere, eller hva ???
Avatar billede netspinner Nybegynder
03. juni 2004 - 11:02 #10
Jeg fik det dog til at køre - ud fra samme linie du har foreslået.
Jeg sidder og finpudser GUI'en, men er stærkt i tvivl om GridLayout nu også er det rigtige valg... Jeg kaster lige min kode ind, hvis der nu skulle være nogen der har lyst til at forbedre GUI'en stærkt. Komponenternes positioner stinker nemlig lidt, ligeledes hvor figuren positioneres osv.
Det ER så det sidste ;o)...
Avatar billede netspinner Nybegynder
03. juni 2004 - 11:04 #11
Her er koden...:


import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.text.*;
import javax.swing.*;

public class BMI extends Applet implements ActionListener {
   
    private TextField højdeFelt;
    private TextField vægtFelt;
    Label meddel1, meddel2, omdømme;
    private Image vægtklasse;
   
    Panel lp = new Panel();      ///  instancevariable i stedet for
    //Panel vp = new Panel();
    //Panel mp = new Panel();
   
    public void init () { //Initialiserer GUI
      //setLayout(new GridLayout(3,1)); //Som LayoutManager bruger vi GridLayout

      setBackground(new Color(51,51,51)); //Sort
      //setBackground(Color.white);
        setForeground(new Color(255,153,0)); //Orange

        højdeFelt = new TextField(4);
        vægtFelt = new TextField(3);
        lp.add(new Label("Højde i meter (fx 1.82):"));
        lp.add(højdeFelt);

        //vp.add(new Label("Vægt i kilo:"));
        //vp.add(vægtFelt);
        lp.add(new Label("Vægt i kilo:"));
        lp.add(vægtFelt);
        højdeFelt.addActionListener(this);
        vægtFelt.addActionListener(this);

        meddel1 = new Label("Skriv din højde og vægt i tekstfelterne!");
        meddel2 = new Label("BMI-værdien og et udsagn udregnes og udskrives");
        //omdome = new Label();
        //add(omdome);

        //mp.add(meddel1); mp.add(meddel2);
        lp.add(meddel1); lp.add(meddel2);

        add(lp); //add(vp);// add(mp);

        play(getDocumentBase(),"BlueDust.au"); //Afspil lyd ved opstart
        vægtklasse = getImage(getDocumentBase(),"nok1.jpg");
       
        new Figurer(JOptionPane.getFrameForComponent(this), true).show();
        //new Figurer(new javax.swing.JFrame(), true).show();
    }

    public void actionPerformed (ActionEvent e) {
    double højde =0, vægt = 0;

        Graphics g = lp.getGraphics();
        lp.update(g);
        int x = lp.getWidth() - 80;
        int y = ( lp.getHeight() / 2 ) - 25;
        g.setColor(Color.red);

    try {
        højde = Double.valueOf(højdeFelt.getText()).doubleValue();
        vægt = Double.valueOf(vægtFelt.getText()).doubleValue();
        double bmi = vægt/(højde*højde);
        String omdømme = "";

        if (bmi < 18.5) {
        omdømme = "undervægtig";
                    meddel2.setForeground(Color.red);    //Undervægtig:      rød
            play(getDocumentBase(),"BlueDust.au");
            //g.setColor(Color.red);
            g.drawOval(55,55,55,55);
            //g.setColor(Color.blue);
        }
        else if (bmi > 18.4 && bmi < 25) {
            meddel2.setForeground(Color.green);  //Normalvægt:      grøn
            omdømme = "normalvægt";
            g.fillRect(x, y, 50, 50);
        }
        else if (bmi >= 25 && bmi < 30) {
            omdømme = "overvægtig";
            meddel2.setForeground(Color.yellow); //Overvægtig:      gul
            play(getCodeBase(),"BlueDust.au"); //afspil lyd ved overvægtighed
            g.fillOval(x, y, 25, 50);
        }
        else {
            omdømme = "SVÆRT overvægtig";
            meddel2.setForeground(Color.red);    //Svært overvægtig: rød
            // omdome.setForeground(new Color(255,0,0)); //Farv rød
            g.fillOval(x, y, 50, 50);
        }

        NumberFormat nf = NumberFormat.getInstance();
        nf.setMaximumFractionDigits(1);
        meddel1.setText("Dit BMI er " + nf.format(bmi));
        meddel2.setText("hvilket betyder " + omdømme); //udskriv omdømmet
}

    //Tag højde for hvis brugeren har indtastet bogstaver i stedet for tal, eller helt undlader at taste i felterne
    catch (NumberFormatException ex) {
        //Graphics g = vp.getGraphics();
        lp.update(g);
        meddel1.setText("Fejlagtig indtastning, forsøg igen!");
        meddel2.setText("");
    }
}
}
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