Yritän opetella Javaa ja nyt kokeilin applettien tekemistä Sunin oppaan avulla. Nappulan lisääminen onnistui hyvin, mutta kun yritin luoda uuden luokan, tulee seuraavat virheilmoitukset:
class Beeper is public, should be declared in a file named Beeper.java
cannot find symbol
cannot find symbol : class ActionEvent
Koodi on tässä:
import java.applet.*; import java.awt.*; public class applet_testi extends Applet { public void init() { Button nappula = new Button("Paina"); add(nappula); } } public class Beeper implements ActionListener { public void actionPerformed(ActionEvent event) { Component c = (Component)event.getSource(); c.getToolkit().beep(); } }
Kääntäjä on Xcode 2.0, ja käytän Mac OS X:ää.
p.s. Tämä sama luokkaongelma tulee kaikkien Java-ohjelmieni kanssa, ja on ollut jo pitkään; nyt päätin kysyä täältä neuvoa.
Idea on, että laitat kunkin julkisen luokan omaan tiedostoonsa ja nimeät tiedoston luokan mukaan. Eli luokan voit nimetä miten haluat ja niitä voit tehdä kuinka monta haluat, kunhan ne ei ole kaikki samassa tiedostossa.
Joo kiitti, luokkaongelma tuli ratkaistuksi, mutta kääntäjä heittää yhä noita kahta muuta erroria. Mistähän mahtaa johtua...
Juhko kirjoitti:
class Beeper is public, should be declared in a file named Beeper.java
Tiivistelmä (lihavoidut kohdat):
class Beeper should be in Beeper.java.
Beeper-luokan pitäisi olla tiedostossa Beeper.java.
http://java.sun.com/j2se/1.4.2/docs/api/java/
java.awt.event
Class ActionEvent
...
siis:
import java.awt.event.ActionEvent;
tai
import java.awt.event.*;
Pelkkä import java.awt.*;
ei riitä (miksköhän ei...?). Tähän halpaan olen itsekin mennyt.
os kirjoitti:
(miksköhän ei...?)
Koska importissa * ei korvaa .:ttä.
Niin, mutta miksi ei korvaa? :)
EDIT: varmaan siksi, että ko. luokka olisi nyt event.ActionEvent
. Ihan loogista, jos vähän tarkemmin ajattelee.
os kirjoitti:
Niin, mutta miksi ei korvaa? :)
Kyseessä on minusta aivan vastaava tilanne kuin vaikka C++:n nimiavaruuksien kanssa:
namespace A { namespace B { int x; } } using namespace A; int f() { return B::x; // x ei riitä, ja hyvä niin. }
Tai komentorivillä:
rm -f * # ei onneksi sama kuin rm -rf *
Täytyy vielä mainita, kun sitä ei kukaan muu maininnut. Eli Tuota "class Beeper is public, should be declared in a file named Beeper.java" herjaahan ei tulisi myöskään jos Beeper luokkaa ei olisi määritetty julkiseksi, vaan tuo koodi olisi näin:
import java.applet.*; import java.awt.*; import java.awt.event.*; public class applet_testi extends Applet { public void init() { Button nappula = new Button("Paina"); add(nappula); } } class Beeper implements ActionListener { public void actionPerformed(ActionEvent event) { Component c = (Component)event.getSource(); c.getToolkit().beep(); } }
niin, eihän missään ohjelmassa voi olla kuin yksi julkinen luokka ja muut aliluokkia.
Tommittaja kirjoitti:
niin, eihän missään ohjelmassa voi olla kuin yksi julkinen luokka ja muut aliluokkia.
Nyt meni taas pahasti metsään.
// A.java public class A { public static int lkm; public static void main(String [] args) { ++lkm; System.out.println("A: " + lkm); if (lkm < 2) { B.main(args); } } }
// B.java public class B { public static int lkm; public static void main(String [] args) { ++lkm; System.out.println("B: " + lkm); if (lkm < 2) { A.main(args); } } }
# java A A: 1 B: 1 A: 2
# java B B: 1 A: 1 B: 2
Kaksi (omaa) julkista luokkaa, kaksi java-tiedostoa kaksi class-tiedostoa, kaksi erilaista ohjelmaa, joista kumpikin käyttää molempia luokkia.
Ja tuossakin esimerkissä on käytetty myös noiden A:n ja B:n lisäksi näkyvästi kahta muutakin julkista luokkaa: String ja System.
Sitten siellä enemmän tai vähemmän taustalla on käytetty sitäkin useampia (julkisia) luokkia, kuten Object (kaikkien luokkien yliluokka), PrintStream (System.out on tämän luokan ilmentymä) tai ClassLoader (latailee noita muita luokkia).
jaa.. no sitten :S
Sain toimimaan, kiitos ohjeista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.