Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    problema metodi non static da altra classe

    Ciao a tutti.
    Sto continuando il mio studio di Java e mi sono bloccato su un esercizio in quanto non riesco a trovare una soluzione che funzioni.

    Il caso è questo:

    - Io ho creato una classe chiamata Condivisa dove ci sono vari metodi che devo usare in più classi diverse, e quindi sulla base della programmazione ad oggetti ho messo tutto in una sola classe da importare dove voglio.

    - I metodi di questa classe non possono essere static, in quanto devono modificare i valori di alcune reference che stanno nelle classi principali che importano quest'utima.

    Il problema è che quando richiamo i metodi mi da il classico errore di attribuzione non-static ad un membro static. Eppure io non ho definito static i membri delle classi che importano.

    Vi posto un pò di codice

    codice:
    //questa è la classe "Condivisa" che viene importata
    //ovviamente posto solo il codice interessato
    public void setFiltro(Button arg0, Button arg1, Button arg2, Button arg3) {
    		
    		if(condizione) {
    			arg0.setEnabled(false);
    			arg1.setEnabled(false);
    			arg2.setEnabled(false);
    			arg3.setEnabled(false);
    		} else {
    			arg0.setEnabled(true);
    			arg1.setEnabled(true);
    			arg2.setEnabled(true);
    			arg3.setEnabled(true);		
    		}
    	}
    codice:
    //questa è la classe "Main" che importa la classe "Condivisa"
    import com.primo.progetto.Condivisa;
    public class Main {
    
    Button go1;
    Button go2;
    Button go3;
    Button go4;
    
    .... il costruttore inizializza i 4 bottoni
    
    //nel metodo main richiamo il metodo della classe Condivisa
    Condivisa.setFiltro(go1, go2, go3, go4);
    consigli? delucidazioni?
    ammetto di non aver capito in pieno il concetto su cui trovo difficoltà
    Grazie
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Bhe è normalissimo. Per accedere a setFiltro() sei costretto a creare un oggetto in questo caso.

    Una variabile dichiarata come static e' condivisa da tutti gli oggetti. In altre parole, se hai una classe che dichiara una variabile come static, di questa non verrà fatta una copia per ogni oggetto che andrai a creare, ma il suo valore sarà in comune a tutti gli oggetti.

    Un metodo statico opera generalmente su dati statici. Oppure, puoi creare una classe di "utilità", ove eseguirai le operazioni che non dipendono da un particolare oggetto... ad esempio, molto banale: se ti serve una somma, crei all'interno di una classe, un metodo statico che effettua la somma tra a e b.

    La classe Math ad esempio, fa proprio così. Dichiara dei metodi statici!

    Tornando al tuo problema, devi dichiarare i metodi al suo interno come static

  3. #3
    Ciao, innanzitutto grazie per la risposta.

    Purtroppo non sono riuscito a risolvere il problema.
    Ho sia seguito il tuo consiglio, dichiarando static il necessario (sono sicuro di non aver sbagliato questo, dato che eclipse viene incontro segnalando eventuali errori),
    ed ho provato anche creando un'istanza dinamica dell'oggetto Condivisa e successivamente richiamando il metodo.

    Non riporto alcun errore nella console, ma l'applicazione crasha.

    Sono piuttosto sicuro che il problema sia circoscritto a questa comunicazione tra le due classi, sia perchè nella classe Main se commento l'istanza oggetto e il metodo di Condivisa, l'errore sparisce, e sia perchè se utilizzo la classe Condivisa come un Activity a se stante (cioè gli passo dei parametri inizializzati), la classe da sola funziona correttamente.


    Nel secondo tentativo dinamico, ho scritto così il codice

    codice:
    //la classe MAIN
    import com.primo.progetto.Condivisa
    
    ...
    
    Condivisa sp = new Condivisa();
            sp.setFiltro(go1, go2, go3, go4);
    la classe Condivisa ovviamente è rimasta immutata.
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    La tua struttura penso sia più o meno simile a questa:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    
    
    class Utility {
      public static void setValue(JButton bt1, JButton bt2, boolean value) {
        bt1.setEnabled(value);
        bt2.setEnabled(value);
      }
    }
    
    
    
    
    class Frame extends JFrame implements ActionListener {
      private JButton bottone1, bottone2, ad;
      
      Frame() {
        JPanel pannello = new JPanel();
        bottone1 = new JButton("Bottone1");
        bottone2 = new JButton("Bottone2");
        ad = new JButton("Attiva/Disattiva");
        
        pannello.add(bottone1);
        pannello.add(bottone2);
        pannello.add(ad);
        
        add(pannello);
        
        ad.addActionListener(this);
        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      }
      
      public void actionPerformed(ActionEvent ae) {
        if(bottone1.isEnabled() && bottone2.isEnabled()) {
          Utility.setValue(bottone1,bottone2,false);
        }
        else {
          Utility.setValue(bottone1,bottone2,true);
        }
      }
      
      
      
      
      public static void makeGUI() {
        Frame f = new Frame();
        f.setSize(400,400);
        f.setVisible(true);
      }
      
      public static void main(String[] args) {
        try {
          SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
              makeGUI();
            }
          });
        } catch(Exception e) {}
      }
    }
    Hai la classe Frame che ha il metodo main(), da cui viene lanciata l'applicazione (creando un Thread e chiamando un metodo makeGUI(), dovresti farlo sempre quello che vedi nel main).

    Come vedi mi appoggio alla classe Utility ed al metodo setValue() passando i 2 bottoni da abilitare/disabilitare ed il loro valore.

    Se hai ancora problemi posta il codice delle classi coinvolte, o comunque almeno la parte necessaria. ^^

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    più che altro prima Manuelandro (non me ne volere) dovrebbe capire bene la differenza tra metodo statico e non statico e soprattutto ricordare le regole d'uso (che ti hanno indicato) e ricordare anche le regole basilari della programmazione ad oggetti (se progetti bene non hai bisogno di tanti metodi statici a parte le utility)

    Visto che stai studiando chiarisci bene il concetto e poi riprova a fare l'esercizio, tentando di non lavorare staticamente (quando ovviamente possibile)
    RTFM Read That F*** Manual!!!

  6. #6
    Originariamente inviato da Patrick Jane
    ...
    grazie per le delucidazioni.
    In effetti testando e ritestando ho scoperto che il mio problema non è relativo alla classe che creo e che importo in quella main, ma bensì un metodo di un package bello e pronto, che se lo richiamo attraverso una istanza della mia classe, va in errore.

    Probabilmente non ho capito, come dice giustamente valia, alcuni concetti alla base della programmazione ad oggetti.

    Ora facendo più prove, riesco a creare tranquillamente una classe ed importarla in un'altra,
    purchè PERO' i metodi della classe "Condivisa" sono metodi miei creati ad hoc.
    Il problema resta per l'appunto, se in questa classe ci sono metodi predefiniti (magri presi da
    una SDK).

    Ad esempio:

    1)Se creo un metodo mio che fa una semplice somma di due int, riesco a farlo funzionare poi nella classe Main.

    2)Se invece importo un package ed uso un metodo come "requestWindowFeature();" oppure "getWindow()" che sono due metodi del package View della sdk android, quando li richiamo in Main attraverso una istanza oggetto, mi spunta il problema dello statico e non statico.

    In questo caso ho difficoltà a cambiare il modificatore dei metodi, in quanto mi spuntano svariati errori, uno su tutti: la necessità di definire un EnumBody (??)

    Probabilmente mi sto allontanando troppo dagli esercizi di base per la comprensione, ma a questo punto mi piacerebbe capire qual'è il motivo di questi errori.
    Io posto il codice lo stesso, magari senza entrare nel merito di cosa fanno i metodi, forse sono io a sbagliare di base l'approccio.

    codice:
    //la classe Condivisa
    import android.view.Window;
    import android.view.WindowManager;
    
    //nella classe c'è solo questo metodo
    public finestraFullScreen() {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }
    codice:
    //classe Main che importa
    import com.primo.progetto.Condivisa;
    ...
    Condivisa c = new Condivisa();
    c.finestraFullScreen();
    ...
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    forse stai confondendo un po' troppo le cose e andando troppo avanti per le tue competenze (passi dall'esercizio base allo sviluppo di app per android).
    vai gradualmente, altrimenti non capisci dove stai di casa e gli errori che arrivano
    RTFM Read That F*** Manual!!!

  8. #8
    Originariamente inviato da valia
    forse stai confondendo un po' troppo le cose e andando troppo avanti per le tue competenze (passi dall'esercizio base allo sviluppo di app per android).
    vai gradualmente, altrimenti non capisci dove stai di casa e gli errori che arrivano
    guarda, onestamente ho trovato molto più semplice l'approccio android che quello java puro.
    Almeno confrontando i libri di testo che ho acquistato, con l'sdk riesco ad avere una curva iniziale di apprendimento più rapida, in quanto per l'appunto sono favorito dai metodi già crostruiti ad hoc, e man mano che li uso inizio a capire anche la logica di programmazione.

    perchè ho scelto uno strada precisa?
    perchè quando ho aperto il primo libro java (Mattone per Mattone) mi sono ritrovato un pò spiazzato sulla vastità di argomenti, di funzionalità e di settori su cui focalizzarsi.
    http://codecanyon.net/category/all?ref=Manuelandro
    And I bet she told a million people that she'd stay in touch, Well all the little promises they dont mean much,When theres
    memories to be made

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ma in questo modo di perdi una gran quantità di concetti che devono essere appresi per poter programmare in Java. Generalmente si inizia da J2SE comunque.

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da Patrick Jane
    Ma in questo modo di perdi una gran quantità di concetti che devono essere appresi per poter programmare in Java. Generalmente si inizia da J2SE comunque.

    quoto alla stra-grande, perché ci sono tutta una serie di oggetti (in primis ragionare ad oggetti) che non hai e la confusione che fai nel codice ne è la prova lampante.
    RTFM Read That F*** Manual!!!

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.