Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    [JAVA]Errore nel codice

    Salve, all'avvio del mio programma compare questo errore
    Exception in thread "main" java.lang.NullPointerException
    at MyPanel.<init>(Trol.java:33)
    at MyFrame.<init>(Trol.java:136)
    at Trol.main(Trol.java:15)

    ma non riesco a trovare nulla posto il codice se qualcuno può darmi una mano

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.Timer;

    public class Trol {

    public static void main(String[] args){
    MyFrame F= new MyFrame("Esercizio");
    F.setSize(500,500);
    }
    }


    class MyPanel extends JPanel implements MouseMotionListener,ActionListener,MouseListener{
    int abba=0;
    ArrayList<Segmento> segmenti;
    int contaClick;
    Segmento s;
    Timer timer;
    MyPanel panel;
    Color c;

    public MyPanel(){
    segmenti = new ArrayList();

    panel.addMouseMotionListener(this);
    panel.addMouseListener(this);
    contaClick = 0;
    timer = new Timer(25,this);
    timer.start();
    c=(Color.WHITE);
    }

    public void paintComponent (Graphics g){
    super.paintComponent(g);
    if (segmenti.size()>0){
    for (int i = 0; i<segmenti.size(); i++){
    Segmento s = segmenti.get(i);
    g.drawLine(s.getX_inizio(),s.getY_inizio(),
    s.getX_fine(),s.getY_fine());
    }
    }
    }

    public void addSegmento(Segmento s){
    segmenti.add(s);
    }

    public void modSegmento(int x2, int y2){
    segmenti.get(segmenti.size()-1).setX_fine(x2);
    segmenti.get(segmenti.size()-1).setY_fine(y2);
    }

    public void mouseClicked(MouseEvent e) {
    if (contaClick == 0){
    contaClick++;
    s = new Segmento(e.getX(),e.getY(),e.getX(),e.getY());
    panel.addSegmento(s);
    }
    else {
    contaClick = 0;
    s.SegmentoFine(e.getX(),e.getY());
    }

    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    /* System.out.println("segmento creato");*/
    System.out.println("Finali----coord x:" + e.getX()+ " coord y:" + e.getY());

    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseMoved(MouseEvent e){
    if (contaClick == 1){
    panel.modSegmento(e.getX(),e.getY());
    }
    System.out.println("mouse mosso");
    }

    public void actionPerformed(ActionEvent e) {
    panel.repaint();
    }

    public void mouseDragged(MouseEvent e) {
    }

    public Color getColor(){
    return c;
    }

    public void setColor(Color c){
    this.c=c;
    }

    public void clear(){
    contaClick=0;
    s=null;
    segmenti=new ArrayList<Segmento>();
    c=(Color.WHITE);
    }
    }




    class MyFrame extends JFrame implements ActionListener{

    MyPanel mp1;
    JPanel jp1;
    JButton jc1,jb1,jb2;
    JLabel jl1;
    JTextField jt1;

    MyFrame(String s){
    this.setTitle(s);
    this.setLayout(new BorderLayout());
    jl1=new JLabel("PROVA!!!!");
    jl1.setBorder(BorderFactory.createLineBorder(Color .red));
    add(jl1,BorderLayout.NORTH);
    mp1=new MyPanel();
    mp1.setBorder(BorderFactory.createLineBorder(Color .red));
    add(mp1,BorderLayout.CENTER);

    jc1=new JButton("Colore");
    jc1.addActionListener(this);
    add(jc1,BorderLayout.WEST);

    jb1=new JButton("Uscita");
    jb1.addActionListener(this);
    jb1.setBorder(BorderFactory.createLineBorder(Color .blue));

    jb2=new JButton("Clear");
    jb2.addActionListener(this);
    jb2.setBorder(BorderFactory.createLineBorder(Color .blue));

    jt1=new JTextField("");
    jt1.setBorder(BorderFactory.createLineBorder(Color .blue));

    jl1=new JLabel("colore");
    jl1.setBorder(BorderFactory.createLineBorder(Color .blue));
    jl1.setFont(new Font("Comic",Font.PLAIN,14));
    jl1.setForeground(Color.green);

    jp1=new JPanel();
    jp1.setBorder(BorderFactory.createLineBorder(Color .red));
    jp1.setLayout(new GridLayout(3,2));
    jp1.add(jb1);
    jp1.add(jb2);

    jp1.add(jt1);
    jp1.add(jl1);
    add(jp1,BorderLayout.SOUTH);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true);
    }

    public MyFrame(){
    this("Finestra di prova");
    }

    public void actionPerformed(ActionEvent ae) {
    if (ae.getActionCommand().equals("Colore")) {
    Color c = JColorChooser.showDialog(this, "colore", mp1.getColor());
    mp1.setColor(c);

    }
    if (ae.getActionCommand().equals("Clear")) {
    mp1.clear();
    mp1.repaint();

    }

    if (ae.getActionCommand().equals("Uscita")) {
    if (JOptionPane.showConfirmDialog(this,"Confermi uscita","Uscita",JOptionPane.OK_CANCEL_OPTION)==0)
    System.exit(0);
    }

    }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    613
    Racchiudi il codice fra tag [CODE] per mantenerne l'indentazione e distinguerlo dal resto del post, ed usa titoli più precisi per il tuo problema.

    Posta esattamente la riga che solleva l'eccezione, dato che il compilatore te la indica chiaramente.

  3. #3
    Utente di HTML.it L'avatar di yuno
    Registrato dal
    Apr 2010
    Messaggi
    62
    ciao, condivido pienamente con ciò che scrive il grandissimo Kaamos,
    fatto sta che hai fatto un errore molto grossolano, che si vede da lontano

    codice:
    MyFrame(String s){
    this.setTitle(s);
    this.setLayout(new BorderLayout());
    jl1=new JLabel("PROVA!!!!");
    jl1.setBorder(BorderFactory.createLineBorder(Color.red));
    add(jl1,BorderLayout.NORTH);mp1=new MyPanel();
    mp1.setBorder(BorderFactory.createLineBorder(Color.red));
    add(mp1,BorderLayout.CENTER);
    praticamente non crei l'oggetto
    codice:
    MyFrame(String s){
    super();
    .....e poi setti le cose.....
    lo stesso con l'altro costruttore altrimenti setti i parametri ad un oggetto nullo

    ps

    se "super" passi la stringa con il titolo lo setta direttamente

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    direi che il costruttore di JFrame è comunque chiamato.
    Infatti si segue l'ordine:
    1. creazione spazio nell'heap per l'oggetto, con tutti i campi (anche quelli della superclasse) ai loro valori di default
    2. chiamata ad un costruttore della stessa classe (this()) se esiste
    3. chiamata al costruttore implicito/esplicito della superclasse, con relativa inizializzazione dei campi nell'esatto ordine con cui questi sono scritti nella classe
    4. finisco costruttore

    ricordando che questo succede per ogni classe nella gerarchia.

    La chiamata è esplicita se scrivo super () (con i relativi parametri), altrimenti è implicita.
    Ricorda anche che in questo caso il costruttore di default viene comunque chiamato!!
    Quindi l'errore è legato al costruttore, ma fino ad un certo punto.
    se poi noti anche che tutti il costruttore di default (quello chiamato) è di questo tipo

    codice:
     public JFrame() throws HeadlessException {
            super();        
            frameInit();
        }
    significa che subito dopo riferisci qualcosa che ancora non hai inizializzato.
    RTFM Read That F*** Manual!!!

  5. #5
    Utente di HTML.it L'avatar di yuno
    Registrato dal
    Apr 2010
    Messaggi
    62
    valia, scusa ma non ho capito molto bene come fa ad essere chiamato il costruttore, da quello che so io, anche se ancora mi posso sicuramete definire alle prime armi rispetto a te, ma da quello che vedo io nel codice, sono stati ridefiniti i costruttori sia quello di default sia quello che riceve una stringa

    Codice PHP:
    MyFrame(String s){
    ....
    che non chiama il costruttore della super classe
    }

    public 
    MyFrame(){//altro costruttore nella classe postata
    this("Finestra di prova");//richiama il costruttore sopra
    }

    //nella classe myPanel il costruttore
    public MyPanel(){//non chiama il costruttore della super class
    segmenti = new ArrayList();
    panel.addMouseMotionListener(this);
    panel.addMouseListener(this);
    contaClick 0;
    timer = new Timer(25,this);
    timer.start();
    c=(Color.WHITE);

    essendo ridefiniti i costruttori quelli della super classe non vengono chiamati, se non faceva nessun costruttore ma aggiungeva solo metodi,in quel caso c'era la chiamata implicita al costruttore della super classe.

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Fermati un secondo al costruttore di default (quello senza parametri).
    Nel caso in esame, prima di procedere col mio costruttore comunque chiamo il costruttore di default nella classe padre.
    Quindi se la classe estende JFrame, prima chiamo il costruttore di default di JFrame e poi proseguo con il mio costruttore.
    Posso anche decidere quale costruttore chiamare (facendo quindi una chiamata esplicita), ma il costruttore della classe padre viene comunque chiamato prima di procedere con la classe figlia.
    se tu hai una chiamata a this(), prima passi all'altro costruttore e da quello prima risali la gerarchia e poi continui con il tuo.

    Se tu non avessi aggiunto un costruttore, il compilatore ne avrebbe aggiunto uno di default, che alla fine avrebbe chiamato solo i costruttori della gerarchia al tuo posto.
    Il fatto che tu ne aggiunga uno (o più di uno) significa che vai ad indicare COME creare l'oggetto, ma la chiamata al costruttore di default c'è sempre, a meno che tu esplicitamente non vai ad indicare quale costruttore vuoi chiamare.
    Non riesco a spiegarmi meglio. La vera confusione c'è in C++ perché hai ereditarietà multipla, quindi capire l'ordine di chiamata spesso non è facile.

    In questo caso particolare, chiama il costruttore di default, successivamente ha qualcosa di non inizializzato che dà la NPE. Bisognerebbe capire chi/cosa causa la NPE.
    RTFM Read That F*** Manual!!!

  7. #7
    I costruttori vanno bene così come sono. non è necessatio invocare il super(). Il problema è qui:

    codice:
    ...
    panel.addMouseMotionListener(this);
    ...
    l'attributo panel è stato dichiarato ma NON istanziato.

    P.S.
    x mezmerize. Lo stacktrace ti dice esattamente a quale riga si verifica l'eccezione. Bastava esaminare la riga incriminata per capire il problema!
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da satifal
    I costruttori vanno bene così come sono. non è necessatio invocare il super().
    appunto, super() è chiamato di default!!
    Si io non ho letto il codice non correttamente indentato e per questo cercavo la NPE (o dove si verificava)
    RTFM Read That F*** Manual!!!

  9. #9
    Utente di HTML.it L'avatar di yuno
    Registrato dal
    Apr 2010
    Messaggi
    62
    ho imparato qualcosa grazie ragazzi! ho appena testato e come immaginavo avevate ragione voi! devo dire una cosa però il mio prof ha detto una cazzata! visto che questa cosa sui costruttori la ha sottolineata più e più volte! (o magari intedeva un'altra cosa e io non capivo).
    Comunque ancora grandi voi e grande forum!

  10. #10
    Originariamente inviato da valia
    appunto, super() è chiamato di default!!
    Si io non ho letto il codice non correttamente indentato e per questo cercavo la NPE (o dove si verificava)
    Sisi, infatti l'appunto non era riferito alla tua risposta
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.