Gå til innhold

RavnTM

Medlemmer
  • Innlegg

    31
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av RavnTM

  1. Du trenger ikke "( kunde > 1)", else-blokken kjøres om ingen av de andre valgene treffer, altså om kunde ikke er 1 eller 0.

     

    if (kunde == 0)
       // Kunde er lik 0
       pris = 25.5 * kg;
    else if (kunde == 1)
       // Kunde er lik 1
       pris = 20.0 * kg;
    else
       // Kunde er lik noe annet
       pris = 25.5 * kg;
    

     

    Hvis du vil at blokken bare skal kjøres om kunde er større enn 1, kan du legge til en ekstra if-else-blokk,

    else if (kunde == 1)
       ...
    else if (kunde > 1)
       ...
    

     

    men da mangler pris en verdi når kunde ikke er 0, 1 eller større enn 1. ;)

    • Liker 1
  2. Det er fordi brukeren kan taste inn tall som ikke er 1 eller 0.

     

    Hvis brukeren skriver 1, får pris verdien "25.5 * kg", og hvis brukeren skriver 0, får den "20.0 * kg", men hvis brukeren skriver noe annet, som for eksempel 3, får aldri pris noen verdi.

     

    Du kan rette opp problemet med en else-blokk som setter pris til noen annet, eventuelt gi en feilmelding.

     

    Edit: Uff, gikk litt fort der. :-)

     

    Edit 2: Haha, jeg la faktisk ikke merke til de logiske feilene som quantum nevner, men løsningen min burde fortsatt fungere.

  3. Her er litt kode som kan hjelpe deg i gang. :)

     

    final JComboBox c = new JComboBox(new String[] {
    "Valg 1",
    "Valg 2",
    "Valg 3"
    });
    
    c.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
    	String value = (String) c.getSelectedItem();
    	if (value.equals("Valg 1"))
    		; // Kode for "Valg 1"
    
    	else if (value.equals("Valg 2"))
    		; // Kode for "Valg 2"
    
    	else if (value.equals("Valg 3"))
    		; // Kode for "Valg 3"
    }
    });
    

     

    Merk at det som vises i JComboBox er toString()-metoden til elementene, så du kan gjerne bruke egne klasser.

    Eksempel:

    
    class Valg {
      String navn, data;
      Valg(String n, String d) {
          navn = n;
          data = d;
      }
      public String toString(){
          // Dette er teksten som vises i JComboBoxen.
          return navn;
      }
      public String getData() {
          return data;
      }
    }
    
    ...
    
    
    Vector<Valg> valg = new Vector<Valg>();
    valg.add(new Valg("Valg 1", "Hei"));
    valg.add(new Valg("Valg 2", "Hallo"));
    valg.add(new Valg("Valg 3", "..."));
    
    valgliste = new JComboBox(valg);
    
    ...
    
    public void actionPerformed(ActionEvent e) {
       Valg v = (Valg) valgliste.getSelectedItem();
       textbox.setText(v.getData());
    }
    

     

    Når du så velger "Valg 2" fra menyen, blir teksten i textbox satt til "Hallo". :)

     

    Bare si ifra om det ble litt uklart, så skal jeg prøve å forklare det litt bedre. ;)

  4. Det vil jeg tro er fordi kodeeksemplene er utdaterte.

    Det at man kan gjøre ting som å legge til elementer direkte på JFrame kom i senere utgaver av Java.

     

    pane.add(srcdj, BorderLayout.CENTER) setter ikke BorderLayout, men sier til panelet at den skal vise det elementet sentrert om den er satt til BorderLayout.

    Man setter et panel til BorderLayout sånn her:

    pane.setLayout(new BorderLayout())

     

    men hvis du kjører denne koden her

    JFrame fr = new JFrame();
    System.out.println(fr.getLayout());
    

    så vil du se at den er satt til BorderLayout fra før av.

  5. Kan du ikke få den til å bare oppdatere dersom musen ikke er "nede"?

     

    Altså noe slikt:

     

    boolean mousePressed = false;
    
    // ...
    
    trackTime.addMouseListener(new MouseListener() {
       public void mousePressed(MouseEvent e) {
           mousePressed = true;
       }
       public void mouseReleased(MouseEvent e) {
           mousePressed = false;
       }
       //...
    });
    
    //...
    
    public void updateTrackTime() {
       // ...
       int value = mp3.getTime();
       if (!mousePressed) {
           trackTime.setValue(value);
       }
    }

     

    Det finnes sikkert en bedre løsning, men jeg kom ikke på noe annet.

  6. Kall validate()-metoden på vinduet etter du har lagt til noe for å oppdatere det. :)

     

    Eksempel:

    import javax.swing.*;
    
    public class Vindu extends JFrame {
      public Vindu() {
          super("Testvindu");
          setSize(300, 300);
          setVisible(true);
          setDefaultCloseOperation(3);
      }
    
      public static void main(String[] args) {
          Vindu v = new Vindu();
    
          // Vi venter litt så vinduet får roet seg ned
          try { Thread.sleep(1000); }
          catch (InterruptedException ie) { }
    
          // Her er vinduet helt blankt
          v.add(new JLabel("Hallo!"));
          // Her er vinduet fortsatt helt blankt
          v.validate();
          // Nå vises JLabelet
      }
    }

  7. Nei, det har ingenting med setBackground() å gjøre.

     

    Grunnen til at du får den advarselen, er fordi et sted oppe i hierarkiet, implementerer JApplet Serializable.

     

    Du kan enten velge å ignorere det, eller legge til denne linjen et eller annet sted i klassen din:

    private static final long serialVersionUID = xxxxxxxL;

    Hvor xxxxxx er et tilfeldig valgt tall.

     

    Hvis du velger å ignorere det, kan du gå inn i Eclipse for å få den til å slutte å advare deg sånn her:

    Window -> Preferences -> Java -> Compiler -> Errors/Warnings -> Potential programming problems -> Serializable class without serialVersionUID -> Ignore

  8. Men hva med while-løkken?

    While-løkken er der så den finner alle, og ikke bare en linje. ;)

     

    Vil da svarene legge seg i url og title så hvis jeg vil skrive dem ut på skjerm skriver jeg bare System.out.println(url +""+title);?

    Ja.

     

    Jeg tenker også spesielt på addResult(url, title). Hva gjør den? Den ville heller ikke kompilere når jeg prøvde.

    Det er fordi den ikke eksisterer!

    Det var bare ment som en "gjør noe med url og title"-metode, du kan gjøre hva som helst med dem. :p

  9. Det gjorde det. Tusen takk, men kunne du forklart denne setningen litt bedre?

    Pattern regex = Pattern.compile("<a href=\"([^\"]+)\" class=l><em>([^<]+)</em>");

    Skjønner ikke helt hvordan du har delt opp setningen inne i Pattern.compile().

     

    Det er et regulært uttrykk. Ganske nyttig å lære seg! :)

     

    <a href=\"([^\"]+)\" class=l><em>([^<]+)</em>

    (Man kan ikke bruke " inne i strenger, så jeg må 'escape' dem med \)

     

    ([^bokstav]+)

    Dette betyr at den skal putte alt den finner helt til den kommer til "bokstav" i matcher.group(n), hvor n er nummeret til parentesen.

    F.eks:

    Streng: "hallo verden!"
    Regex: ([^v]+)
    matcher.group(1) = "hallo "

     

    Alt som ikke er "spesialbokstaver" i en regex blir tolket som ren tekst og må finnes før den leter etter resten.

    Streng: <b>hei</b>
    Regex: hei<([^>]+)>
    matcher.group(1) = "/b"

     

    Oi, jeg må gå nå, så jeg får ikke skrevet ferdig, du får ta en titt her: http://www.regular-expressions.info/

  10. Som data_jepp sa, har Google sikkert noe I APIen sin for dette, men hvis du ønsker å hente det ut fra teksten, kan du bruke regulære uttrykk. :)

     

    Du burde ta en titt på noen hjelpesider for regulære uttrykk. (Bare søk etter "regular expressions" eller "regex")

     

    Hvis du ikke orker, kan du bare se på denne koden som gjør omtrent det du ønsker(tror jeg)

     

    import java.util.regex.*;
    ...
    String site = getWebsite();
    Pattern regex = Pattern.compile("<a href=\"([^\"]+)\" class=l><em>([^<]+)</em>");
    Matcher matcher = regex.matcher(site);
    
    while (matcher.find()) {
    String url = matcher.group(1);
    String title = matcher.group(2);
    addResult(url, title);
    }

     

    Håper det hjalp. :)

  11. For å starte en tråd, bruker du start(), ikke run(). ;)

    Hvis du kaller run-metoden direkte, starter den ikke i en ny tråd, men hvis du kaller start-metoden, så kaller Thread-klassen run metoden for deg, i en ny tråd. :)

     

    Du kan også gjøre sånn her for det samme, bare uten mange klasser:

    public static void main(String[] args) {
      Runnable run = new Runnable() {
      public void run() {
    	 // Trådkode her
      }
    };
    
    Thread t = new Thread(run);
    t.start(); // Starter tråden
    }

    (hvis jeg husker rett - har ikke programmert i Java på en stund)

  12. Hvorfor ikke bare bruke to for-løkker?

     

    for (int i = 0; i < 11; i++) {
     int sum = 0;
     for (int k = 0; k < 17; k++) {
    sum += utvinning[i][k];
     }
     System.out.println("Samlet utvinning for rekke " +i + " er " + sum + ".");
    }

     

    Forresten er feilen at du tar rekke++ inni for-løkken, så både felt og rekke blir oppdatert.

     

    int rekke = 0;
    do {
     for (int felt = 0; felt < 17; felt++) {
    rutvinning = rutvinning + utvinning[rekke][felt];
    skjerm.outln("Samlet utvinning for rekke " + rekke + " er " + rutvinning + ".");
     }
     rekke++;
    } while (rekke < 11);

  13. Jeg er litt trøtt så jeg kan ta feil, men her er de tingene jeg ville ha endret:

    • Følg Java konvensjonen! Du finner den her
      F.eks skal klassenavn alltid starte med stor bokstav.
    • Bruk switch-statements. (her)
      Når du skal sjekke om en variabel har spesifikke verdier, er det lettere å bruke switch istedenfor mange if/else if/else.
      switch (value) {
       case 1: actionOne(); break;
       case 2: actionTwo(); break;
       case 3: actionThree(); break;
       default: noneOfTheAbove(); break;
      }


      ser mye bedre ut enn

      if (value == 1) {
       actionOne();
      } else if (value == 2) {
       actionTwo();
      } ... else {
       noneOfTheAbove();
      }


    • Bruk mer mellomrom.
      if (val <= 4 && val != 2)
      er lettere å lese enn
      if(val<=4&&val!=2)

    Jeg ser også at du hele tiden lager nye instanser av Random-klassen, hvorfor? Du burde bare ha én instans av den som en klasse-variabel du kan bruke rundt om i hele programmet. :)

     

    Ellers ser det veldig fint ut til å være ditt første program! :)

  14. Du kan ikke bruke en foreach(for (Object obj : objects)) løkke når du skal gi verdier til en liste.

    Når du bruker en foreach løkke, får du bare en kopi av elementet og ikke selve referansen til variabelen som er i listen.

     

    Det du gjør med den første løkken er ikke å skaffe indeksen til alle elementene, men du får verdien, som er 0, siden det er standardverdien til heltall(0.0 for flytetall, 0 for char, false for boolean).

     

    Hvis du vil ha indeksen til hvert element i arrayen, så må du bruke en vanlig for-løkke:

     

    for (<init>; <cond>; <inc>) {
    <code>
    }

    <init>: Initiering av tellevariabelen, for eksempel int i = 0. Utføres før løkken starter

     

    <cond>: En tilstandsjekker som utføres hver gang før koden blir kjørt. i < array.length

     

    <inc>: Oppdatering av tellevariablen. Utføres hver gang etter koden har kjørt. i++

     

    <code>: Koden som skal utføres i løkken. :)

     

    Eksempel:

    for ( int item = 0; item < anArray.length; item++ ) {
     anArray[item] = (item + 1) * 100;
    }

     

    Hvis det er noe du ikke forstår, så er det bare å spørre, for-løkker er alltid vanskelig for nybegynnere. ;)

     

    Edit:

    Java tutorialen har en for-løkke side:

    http://java.sun.com/docs/books/tutorial/ja...dbolts/for.html

  15. Strålende! Men det er en ting jeg ikke skjønner.. Et objekt kan jo inneholde flere felter, eller variabler? sammenligner den i så fall alle? Og hva med metoder?

    Dette er kanskje veldig teit :/ Men kan man bruke .equals på objekter av forskjellig klasse? Det gir jo på en måte ikke mening å gjøre det..

     

    Hvilke variabler .equals metoden sjekker er definert i klassen. :)

     

    Du kan prøve å lage en klasse som definerer sin egen equals metode og leke litt rundt med den. :)

    class Website {
     String url;
    
     public boolean equals(Object obj) {
    Website site = (Website) obj; // Må "caste" den
    return site.url.equals(url);
     }
    }

     

    Det er omtrent som toString metoden som alle klasser har.

     

    File klassens toString metode: fil navnet

    Integer klassens toString metode: tallet

    URL klassens toString metode: adressen

     

    Hvis toString metoden ikke er definert i en klasse, så brukes Object.toString, som bare printer navnet på klassen og hashCode.

     

    Det er akkurat det samme med equals metoden, bare at den returnerer sann/usann istedenfor en String. ;)

  16. Oki. Men vil det fungere å teste om a og b er like med == her, eller var det bare en rask forklarende måte å skrive det på?

     

    Med primitive typer (int, double, float, char, byte, long, short, boolean), kan man bruke ==, men med objekter(som String, Object, Random, PrintStream, File) må man bruke .equals hvis man vil sjekke om de er "like".

     

    ==

    Samme adresse(primitive typer har alltid lik adresse. 1 og 1 kan jo ikke være to forskjellige steder. :) )

    Man bruker dette også med objekter, men da er det for å sjekke om det er samme objekt.

    // Lager to objekter av klassen Integer
    // som begge har verdien 1.
    Integer a = new Integer( 1 );
    Integer b = new Integer( 1 );
    
    if (a == b) {
     // Kan ikke skje, siden a og b ikke er samme objekt
    }
    if (a.equals(b)) {
     // Siden Integer klassen definerer equals metoden
     // sin sånn at den ser om int-verdiene er like, så 
     // er a.equals(b) lik true.
    }

     

    .equals

    En metode som er definert i klassen.

    String klassen definerer metoden sånn at den sjekker om alle bokstaver er like.

    Den ser omtrent sånn her ut:

    public boolean equals(Object obj) {
      if ( !(obj instanceof String) )
      return false;
    
    char[] bokstaverObj = ((String)obj).toCharArray();
    char[] bokstaverMeg = this.toCharArray();
    
    if (bokstaverObj.length != bokstaverMeg.length)
       return false;
    
    for (int i = 0; i < bokstaverObj.length; i++) {
      if (bokstaverObj[i] != bokstaverMeg[i])
    	return false;
    }
    
    return true;
    }

    (Den ser selvfølgelig ikke akkurat sånn ut, men det var bare et eksempel på klasse-definerte equals-metoder)

     

     

    if(Array.getLength(args) > 2) {String element3 = args[2];}

     

    Alle arrayer har en variabel "length", som du kan aksessere for å sjekke antall elementer. :)

     

    Eksempel:

     

    public static void main(String[] args) {
      int lendge = args.length; // Henter antall elementer
      if (length == 0) {
       System.out.println( "Feil!" );
       System.exit(1); // Stopper programmet
      }
    ...
    }

  17. Kjempe! Begynner å forstå ting nå..

    Men kan et array inneholde flere datatyper? Hva om main(String[] args) gjerne skulle tatt imot en string og en int?

     

    main metoden ha signaturen main(String[]) hvis du vil kalle den med java kommandoen.

     

    Hvis du har et program som skal ha numeriske argumenter, så må du "parse" dem.

     

    For å "parse" en int, kan du bruke metoden Integer.parseInt(String), som tar ett argument; en String.

    Eksempel:

     

    public class Kvadrat {
    public static void main(String[] args) {
    	String førsteElement = args[0];
    	int tall = Integer.parseInt(førsteElement);
    	int kvadrat = tall * tall;
    
    	System.out.println( tall + "^2 = " + kvadrat );
    }
    }

     

    Når du kjører programmet sånn her:

    java Kvadrat 3

    så printer det ut 3^2 = 9.

     

    Du kan bruke samme metode for flytetall også, men da må du bruke metoden Double.parseDouble(String) istedenfor. ;)

     

    Ta en titt på Array siden til Sun, så forstår du sikkert String[] args bedre. :)

  18. Hva skjer om jeg skriver public static void main() i stedet? Rett og slett dropper innholdet i parantesene? For Strings args inneholder vel ikke noe i programmet mitt?

     

    Hvis du ikke tar med String[] args, så er det ikke 'main' metoden!

    Når du kjører programmet med kommandoen java Program, så kaller JVM-en(Java Virtual Machine) main(String[]) metoden i klassen som heter Program.

     

    Alle metoder har en "signatur", altså hva som definerer akkurat den metoden.

    Du kan ha flere metoder som heter main, men når du bruker java kommandoen, kalles den som har signaturen main(String[]).

     

    Meningen med String[] args er hvis du for eksempel skal lage programmer som tar filer som input, og istedenfor å måtte spørre brukeren når programmet kjører, kan du bare starte programmet med kommandoen java Program minfil.txt, for da settes args[0](første element i listen) lik "minfil.txt", som du senere kan bruke i programmet. :)

     

    Og hvordan kan jeg i klassen print kalle HelloWorldApp.main?

     

    Akkurat som du kaller andre metoder. :)

    Du kan enten lage en tom array av typen String som du kan bruke som parameter slik:

    String[] tomListe = { };
    HelloWorldApp.main(tomListe);

    , eller så kan du bruke nøkkelordet null, som betyr "ingenting":

    HelloWorldApp.main(null);

     

     

    Og det virker litt som om all koden må ligge i klasser, og at forskjellige klasser bare kaller hverandre. Er det slik det fungerer, eller kan kode også stå helt fritt?

     

    All kode må være i en klasse. I java kan du ikke "kjøre" en fil, du kan bare kalle metoder i klasser. :)

     

    Håper dette hjelper. :)

     

    PS.

    Kan være litt rotete, jeg er trøtt. :p

×
×
  • Opprett ny...