Avatar billede Bennysørensen Praktikant
05. december 2003 - 20:23 Der er 12 kommentarer og
1 løsning

Swing, JFrame og en masse ClassDefNotFound-fejl.

Jeg skal lave en opgave, hvor jeg skal kigge på compile- eller runtime-fejl, hvis jeg add'er en JButton direkte til en JFrame

Koden har jeg stjålet fra en bog, og så lavet en JButton.

Here goes:
import java.awt.*;
import javax.swing.*;
public class AddJButton extends JApplet
{
    public void init()
    {
        getContentPane().add(new JLabel("Applet!"));
    }
    //en main-metode til applikationen
    public static void main(String[] args)
    {
        JApplet applet = new AddJButton();
        JFrame frame  = new JFrame("AddJButton");
        JButton button = new JButton();
        //frame.getContentPane().add(button);
        frame.add(button);
        //til at lukke applikationen
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(applet);
        frame.setSize(100,50);
        applet.init();
        applet.start();
        frame.setVisible(true);
    }
}

Jeg har lavet en applet i SUN's Forte For Java, 3.0, og lagt koden ind dér. Jeg får en

java.lang.NoClassDefFoundError: legeplads/Swing/AddJButton (wrong name: AddJButton)
        at java.lang.ClassLoader.defineClass0(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:486)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:111)
        at sun.applet.AppletClassLoader.findClass        at java.lang.ClassLoader.loadClass(ClassLoader.java:253)....etc etc.

Appletten kommer frem på skærmen, og skriver "Applet!" som den skal, men der står også "Applet not initialised".

Desuden får jeg ingen fejl ved hverken den ene eller den anden måde at add'e JButton'en på, så jeg regner med at der er noget galt.

Desuden er der en lille underlig ekstra-fejl, jeg ikke forstår: Jeg får at vide at der er en invalid package declaration, men når jeg så skriver den rigtige ind, begynder jeg at få "Class or interface expected"-fejl...?

Venligst
Avatar billede arne_v Ekspert
05. december 2003 - 20:29 #1
Java mener at AddJButton.class burde indeholde klassen
legeplads.Swing.AddJButton (udfra dens placering i directory)
men den indholder klassen AddJButton.

Og det brokker den sig over.

Altså skal du have det projekt struktureret om så directories matcher packages.
Avatar billede _carsten Nybegynder
05. december 2003 - 21:57 #2
Jeg tror du har overset nogle ting.

1. Nedenstående er totalt umligt - kan ikke lade sig gøre
    >>>Appletten kommer frem på skærmen, og skriver "Applet!" som den skal,
    >>>men der står også "Applet not initialised".

    Appletten skriver kun teksten "Applet1" hvis den er initieret, uanset
    om det er i appletviewer eller browser, din init() gør jo ikke andet!

2. frame.add(button);  ja - her er der noget galt
  Giver ingen compilefejl, men derimod runtime fejl - du vil aldrig kunne
  køre den som applikation, da det ikke kan lade gøre at adde komponenter
  til en frame, men compileren brokker sig ikke da metoden arves fra
  JComponent


D.v.s selv om du for den tilrettet med package vil den klasse aldrig kunne køres som applikation, grundet frame.add(button);

Hvis du retter til følgende
    //frame.add(button);
    frame.getContentPane().add(button);

    Vil du heller ikke kunne se knappen, da du afslutter initieringen
    af applikationen med at simde en applet inden i.
Avatar billede _carsten Nybegynder
05. december 2003 - 22:13 #3
Man kan jo også vende det om, og sige at opgaven jo egentlig er god nok
da den ikke giver compilefejl, men derimod runtimefejl

En ting mere
SUN's Forte For Java, 3.0 er altså en gammel hund, der har været flere
version frem til afløseren, som nu hedder NetBeans 3.5.1
Så den ville jeg skynde mig lidt at hente:      http://www.netbeans.com
Den er gratis og bygger videre på SUN One/Forte
Avatar billede arne_v Ekspert
05. december 2003 - 22:16 #4
Det er vist omvendt. Sun ONE/Forte bygger på NetBeans.
Avatar billede _carsten Nybegynder
05. december 2003 - 22:20 #5
Ja - selvfølgelig :-)
Avatar billede Bennysørensen Praktikant
06. december 2003 - 18:22 #6
Ok, udover det sædvanlige brok over at jeg ikke kan få lov at give jer points når I kun kommenterer, kan jeg ikke regne ud hvordan jeg skal strukturere mit projekt om, så det passer med directories. Jeg har hentet en masse eksempelprogrammer fra mit kursus' hjemmeside, og det plejer at være nok at lægge dem i en mappe og så lave en  - package mappenavn.mappenavn; -...jeg forstår ikke lige hvorfor applets ikke fungerer med dén metode.

Før jeg har fået fanget dét kommer jeg vist ikke så meget videre :o)
Avatar billede arne_v Ekspert
06. december 2003 - 18:28 #7
Prøv og tag Windows Explorer og check om package matcher directory
på filerne.

Og så skal compile fejl udrydes.
Avatar billede arne_v Ekspert
06. december 2003 - 18:29 #8
Jeg undrer mig også over at der er en main metode i en applet.

Normalt har applets ikke en main metode.

main metode er noget der hører selvstændige applikationer til.
Avatar billede arne_v Ekspert
06. december 2003 - 18:29 #9
Jeg kan da godt ligge et svar.
Avatar billede arne_v Ekspert
06. december 2003 - 18:31 #10
extends JFrame + main metode + kørsel standalone

eller

extends JApplet + init metoder + kørsel i browser udfra HTML side
Avatar billede Bennysørensen Praktikant
06. december 2003 - 18:32 #11
Nåh, nu virker det så alligevel et stykke hen ad vejen (det var et lille 's' i min sti...)

..men jeg får stadig en masse classdefnotfound errors, selv i mine læreres gennemafprøvede kode.

Ex:

import java.awt.*; // her er de fleste layout managers
import javax.swing.*;

public class LayoutEx01{
    public static void main( String[ ] args ){
        JFrame frame = new JFrame( "BorderLayout" );
        JButton button1 = new JButton( "NORTH" );
        JButton button2 = new JButton( "EAST" );
        JButton button3 = new JButton( "SOUTH" );
        JButton button4 = new JButton( "WEST" );
        JButton button5 = new JButton( "CENTER" );
        frame.getContentPane( ).setLayout( new BorderLayout( ) );
        frame.getContentPane( ).add( button1, BorderLayout.NORTH );
        frame.getContentPane( ).add( button2, BorderLayout.EAST );
        frame.getContentPane( ).add( button3, BorderLayout.SOUTH );
        frame.getContentPane( ).add( button4, BorderLayout.WEST );
        frame.getContentPane( ).add( button5, BorderLayout.CENTER);
        // Pakker framen til den størrelse den helst vil have ;-)
        frame.pack( );
        frame.setVisible( true );
    }
}

...java.lang.ClassCastException: legeplads.Swing.LayoutEx01
        at sun.applet.AppletPanel.createApplet(AppletPanel.java:579)
        at sun.applet.AppletPanel.runLoader(AppletPanel.java:515)
        at sun.applet.AppletPanel.run(AppletPanel.java:293)
        at java.lang.Thread.run(Thread.java:484)
Avatar billede arne_v Ekspert
06. december 2003 - 18:47 #12
Den kode kører fint hos mig.

Og jeg forstå ikke den stacktrace - den snakker stadig om applets.

Jeg tror Forte har fået blandet lidt applikation og applet
sammen.

Og at den kører noget helt anden end det den skal.
Avatar billede Bennysørensen Praktikant
06. december 2003 - 18:55 #13
Weird...det må løse sig en anden dag...jeg skal på arbejde. Tak for hjælpen.
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