Da ambiente BlueJ funziona ma come jar no

di il
6 risposte

Da ambiente BlueJ funziona ma come jar no

Ciao a tutti, per esercitarmi (sono molto alle prime armi) ho creato un semplice frame con un pulsante, una label e un campo di testo; semplicemente ad ogni click del pulsante cambia lingua del testo (italiano/inglese) delle label e del campo di testo; se lo compilo e lo lancio dall'ambiente BlueJ tutto ok, se invece creo il file jar, il frame si apre ma il pulsante non funziona; se provo lanciare il jar da cmd esce il seguente errore:

main" java.lang.NoClassDefFoundError: Jframe$UnNomeQualsiasi
at Jframe.iniziaFrame(Jframe.java:40)
at Jframe.main(Jframe.java:22)
Caused by: java.lang.ClassNotFoundException: Jframe$UnNomeQualsiasi
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
... 2 more

Vi giro anche il codice:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
 

public class Jframe {
JFrame frame = new JFrame();
JButton button = new JButton("Italiano");
JLabel label = new JLabel ("Hello World");
JTextField textField= new JTextField ("Hello World");
    
public static void main(String[] args){
Jframe newframe = new Jframe();
newframe.iniziaFrame();   
}
public void iniziaFrame(){

    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    frame.setSize(500,250);
    button.setBounds(175,25,150,25);
    label.setHorizontalAlignment( JLabel.CENTER );
    label.setBounds(175,75,150,25);
    textField.setBounds(175,125,150,25);
    textField.setHorizontalAlignment( JTextField.CENTER );
    frame.setLayout (null);
    frame.add(button);
    frame.add(label);
    frame.add(textField);
    frame.setVisible (true);
        UnNomeQualsiasi listener = new UnNomeQualsiasi();
    button.addActionListener(listener);
   
}
     public class UnNomeQualsiasi  implements ActionListener{
            public void actionPerformed (ActionEvent evt){
        String attuale=label.getText();
        if(attuale=="Hello World"){
            button.setText("Inglese");
            label.setText("Ciao Mondo");
            textField.setText("Ciao Mondo");
        }
        else{
            button.setText("Italiano");
            label.setText("Hello World");
            textField.setText("Hello World");    
        }
    }   
}  

}
Ho cercato in rete e qui nel forum, ma non sono riuscito a capire...qualcuno può aiutarmi ?

6 Risposte

  • Re: Da ambiente BlueJ funziona ma come jar no

    carlo4477 ha scritto:


    se invece creo il file jar, il frame si apre ma il pulsante non funziona;
    Come hai creato il jar? (precisa comando, posizione, ecc...)

    Perché quel tuo codice ha 2 classi: Jframe e Jframe$UnNomeQualsiasi (che è una "inner class"). Quindi entrambe devono finire dentro il jar (chiaramente i .class, non i sorgenti .java).
  • Re: Da ambiente BlueJ funziona ma come jar no

    Per creare il jar ho usato direttamente l'opzione "Crea file jar", specificando la classe principale (Jframe) e nient'altro

    https://www.dropbox.com/s/dmxzs0pr0n5xlkm/crea_file_jar.PNG?dl=0

    grazie
  • Re: Da ambiente BlueJ funziona ma come jar no

    carlo4477 ha scritto:


    Per creare il jar ho usato direttamente l'opzione "Crea file jar", specificando la classe principale (Jframe) e nient'altro
    Non conosco BlueJ, quindi non so come funziona quella opzione, se ha delle caratteristiche o limiti particolari.

    Se il problema è un NoClassDefFoundError: Jframe$UnNomeQualsiasi, come hai indicato, vuol dire che quella inner class non è nel jar.
    Se è BlueJ che non l'ha inserita nel jar (per qualche motivo) allora è, presumibilmente, un suo limite.

    Verifica comunque il contenuto del jar.
  • Re: Da ambiente BlueJ funziona ma come jar no

    Contenuto del file jar:



    mentre qui c'è il contenuto del file manifest.mf:

    Manifest-Version: 1.0
    Class-Path:
    Main-Class: Jframe
  • Re: Da ambiente BlueJ funziona ma come jar no

    carlo4477 ha scritto:


    Contenuto del file jar:

    Non riesco a vedere quel link. Ma NON è importante.
    C'è Jframe$UnNomeQualsiasi.class ?
    Sì, ok. No, il jar è creato male.
  • Re: Da ambiente BlueJ funziona ma come jar no

    Ho risolto, grazie; jFrame$UnNomeQualsiasi.class c'era, ma ho scoperto che c'era anche della roba che non doveva esserci (tipo jFrame$MyButtonListener.class, che era il nome della classe prima che lo modificassi, oppure JFrame$1.class...); è bastato ricreare la classe in un'altra collocazione e creare di nuovo il file jar e ha funzionato...senza il tuo spunto però non ce l'avrei fatta !
Devi accedere o registrarti per scrivere nel forum
6 risposte