Cambiare un attributo con un jbutton

di il
6 risposte

Cambiare un attributo con un jbutton

Ho una classe figlia di swing.JButton, quando clicco sul pulsante vorrei cambiare un attributo di una altra classe, ma non capisco come fare dato che entrambe sono istanziate nel metodo main che si trova in un altra classe ulteriore.

public class SimpleBox extends JButton implements ActionListener{ // questo è il pulsante da cliccare

@Override
public void actionPerformed(ActionEvent e) {

//qui non so cosa devo scrivere
}

}

public class Unit{
int att=0; //questo è l'attributo che voglio cambiare


}



import java.awt.*;
import javax.swing.*;
public class App{
public static void main(String[] args){
JFrame frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=new JPanel();
frame.getContentPane().add(panel);

SimpleBox s=new SimpleBox();

panel.add(s);

}




}

6 Risposte

  • Re: Cambiare un attributo con un jbutton

    Mi sono accorto che nel metodo main sopra mancano due righe di codice, ve le metto qua sotto:
    Unit u=new Unit();
    s.addActionListener(new SimpleBox());

    inoltre non vi avevo detto che questo non è il codice completo ma essendo un problema concettuale credo che basti.
  • Re: Cambiare un attributo con un jbutton

    Ci sono più modi per farlo, e quale sia il migliore dipende da cosa rappresentano le classi e come si potrebbe evolvere l'applicazione.

    Per ora ti basta passare il reference dell'oggetto Unit che crei nel main alla tua istanza SimpleBox.
    Definisci il costruttore di SimpleBox in modo da ricevere come parametro un oggetto Unit, e assegni ad una variabile di SimpleBox l'oggetto che ricevi nel costruttore.

    Poi nell'actionPerformed di SimpleBox apporterai la modifica alla variabile che ti sei salvato, non accedere direttamente alla variabile att, ma crea un metodo apposito nella classe Unit per modificare il campo (classicamente si scrive come public void setAtt(int newValue)).

    Questo è appunto un modo,ma per ora è il più semplice e immediato.

    Una cosa sulla riga di codice che hai aggiunto: non ha alcun senso scrivere:
    
    s.addActionListener(new SimpleBox());
    
    In questo modo crei un secondo oggetto SimpleBox (che tecnicamente è un JButton), solo per averlo come listener di un altro JButton.

    Se vuoi che SimpleBox continui ad implementare ActionListener (puoi farlo oppure no,non fa gran differenza), allora nel costruttore di SimpleBox basta aggiungere la riga:
    
    addActionListener(this);
    
  • Re: Cambiare un attributo con un jbutton

    Grazie mille per la risposta!
    ora, perdonatemi l'ignoranza, ma se SimpleBox estende JButton io creando un nuovo costruttore devo metterci qualcosa di particolare perchè continui a funzionare come JButton oppure semplicemente ne creo uno nuovo tipo questo:

    Unit unit;
    public SimpleBox(Unit u){

    unit=u;

    addActionListener(this);

    }

    comunque quello che devo fare è creare una griglia di queste SimpleBox in cui ognuna può o non può contenere una Unit, l'obiettivo finale sarebbe quello di settare un attributo focused nella classe Unit a true quando la casella corrispondente viene cliccata
  • Re: Cambiare un attributo con un jbutton

    Risolto, grazie mille!
  • Re: Cambiare un attributo con un jbutton

    PLAYER.RUNNER ha scritto:


    Grazie mille per la risposta!
    ora, perdonatemi l'ignoranza, ma se SimpleBox estende JButton io creando un nuovo costruttore devo metterci qualcosa di particolare perchè continui a funzionare come JButton oppure semplicemente ne creo uno nuovo
    Quando una classe estende un'altra classe, il costruttore della superclasse viene sempre richiamato, quindi se estendi JButton la tua classe avrà tutte le funzioni di base di un JButton, che poi tu puoi ovviamente modificare o solo ampliare.
    Se la classe estesa ha un costruttore che non richiede alcun parametro, allora la chiamata al costruttore di default (che fai con super()) non è obbligatoria, e viene "aggiunta" in automatico.
    Ma prova a dichiarare una classe con un unico costruttore che richiede un parametro (ad esempio un intero) e a estenderla senza richiamare super(int valore), riceverai un errore in compilazione, perché non può mica inventarsi lui i parametri da passare alla superclasse!

    PLAYER.RUNNER ha scritto:


    comunque quello che devo fare è creare una griglia di queste SimpleBox in cui ognuna può o non può contenere una Unit, l'obiettivo finale sarebbe quello di settare un attributo focused nella classe Unit a true quando la casella corrispondente viene cliccata
    Ok allora va bene che la tua classe contenga all'interno un riferimento a un oggetto Unit.Tieni presente che:

    a) Se Unit è solo una classe di appoggio per il tuo bottone, cioè non è utilizzata da nessuna altra classe, allora sarebbe conveniente "innestarla" all'interno della classe SimpleBox, non so se tu l'abbia mai fatto ma se è questo il caso potresti dare un'occhiata a cosa sia una nested class.
    b) Se lo scopo di Unit è solo avere quella variabile focused o poco più, allora puoi tranquillamente lasciare quella informazione solo all'interno di SimpleBox, se invece deve assolvere qualche compito più specifico o memorizzare molte variabili, a quel punto è sensato e consigliabile avere un oggetto specifico come stai facendo ora.
  • Re: Cambiare un attributo con un jbutton

    Grazie mille ancora.
Devi accedere o registrarti per scrivere nel forum
6 risposte