Newsgroup: it.comp.java
Titolo: Chiamata di Costruttori

Quando, dall'interno di un costruttore, si chiama un costruttore di un'altra
classe, si deve passargli almeno l'oggetto della classe corrente come
argomento?
Perché?

 wrote in message
news:cbJy7.19789$YC3.5...@news1.tin.it...



di solito ha senso chiamare il costruttore di una superclasse, con gli
argomenti necessari, non certo l'oggetto corrente: se hai ridefinito
qualcosa, comunque lavori sull'oggetto corrente.
ma forse non ho capito cosa intendi...
ciao
tityrus

 in genere cmq no ... poi dipende da che devi fare e se ho capito cosa
vuoi.
Effettivamente sono stato molto generico, ma non volevo farvi analizzare
troppo codice.
Comunque vi "posto" il listato che mi fa sorgere questo dubbio.
E' tratto dal libro "Java 2 Guida completa" ed è una specie di convertitore
di colori RGB-HSB; in pratica si digitano dei valori numerici per il colore
nei campi di testo e si verifica il colore corrispondente in un pannello a
lato, che si colora per l'appunto del colore che scaturisce dai valori
digitati.
Ci sono due classi in questa applicazione:
1) una principale, SwingColorTest, che eredita da JFrame, e che è la classe
principale dell'applicazione;
2) poi SwingColorControls, che eredita da JPanel, e che serve a
rappresentare un gruppo di tre campi di testo e gestire le loro azioni.
Il mio dubbio sorge nel momento in cui dall'interno del costruttore
SwingColorTest() della classe principale viene chiamato il costruttore
SwingColorControls() all'atto della istanziazione del pannello della classe
SwingColorControls: perché oltre alle etichette (anzi, l'array di etichette)
gli viene passato anche "this"? Che bisogno c'è di creare l'oggetto frame
della classe principale alla prima linea del costruttore
SwingColorControls() ?
Nel libro c'è scritto << La classe SwingColorControls necessita di un certo
numero di variabili per permettere alle informazioni di essere trasmesse dal
pannello all'applicazione (e perché??). La prima di queste variabili
rappresenta un aggancio alla classe che contiene tale pannello. Dato che è
la classe più esterna dell'applicazione che controlla l'aggionramento di
ogni pannello (perché?), il pannello necessita di un modo per indicare
all'applicazione che qualcolsa è stato modificato. Per richiamare un metodo
nell'applicazione è necessario UN RIFERIMENTO ALL'OGGETTO: la prima
variabile è un riferimento a un'istanza della classe SwingColorTest: e cioè
"frame".....ecc. ecc. >>
Insomma, io non capisco perché ci debba essere questo riferimento
all'oggetto SwingColorTest. Che succederebbe se io passassi solo l'array di
stringhe all'altro costruttore? L'applicazione non funzionerebbe?
Comunque ecco il listato:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingColorTest extends JFrame {
    SwingColorControls RGBcontrols, HSBcontrols;
    JPanel swatch;
    public SwingColorTest() {
        super("Color Test");
        JPanel pane = new JPanel();
        pane.setLayout(new GridLayout(1, 3, 5, 15));
        swatch = new JPanel();
        swatch.setBackground(Color.black);
        String[] rgbLabels = { "Red", "Green", "Blue" };
        RGBcontrols = new SwingColorControls(this, rgbLabels);
        String[] hsbLabels = { "Hue", "Saturation", "Brightness" };
        HSBcontrols = new SwingColorControls(this, hsbLabels);
        pane.add(swatch);
        pane.add(RGBcontrols);
        pane.add(HSBcontrols);
        setContentPane(pane);
    }
    public static void main(String[] arguments) {
        JFrame frame = new SwingColorTest();
        ExitWindow exit = new ExitWindow();
        frame.addWindowListener(exit);
        frame.pack();
        frame.setVisible(true);
    }
    public Insets getInsets() {
        return new Insets(10, 10, 10, 10);
    }
    void update(SwingColorControls control) {
        Color c;
        // get string values from text fields, convert to ints
        int[] value = new int[3];
        for (int i = 0; i < 3; i++) {
            value[i] = Integer.parseInt(control.tfield[i].getText());
            if ((value[i] < 0) || (value[i] > 255)) {
                value[i] = 0;
                control.tfield[i].setText("" + value[i]);
            }
        }
        if (control == RGBcontrols) {
            // RGB has changed, update HSB
            c = new Color(value[0], value[1], value[2]);
            // convert RGB values to HSB values
            float[] HSB = Color.RGBtoHSB(value[0], value[1], value[2],
                (new float[3]));
            HSB[0] *= 360;
            HSB[1] *= 100;
            HSB[2] *= 100;
            // reset HSB fields
            for (int i = 0; i < 3; i++) {
                HSBcontrols.tfield[i].setText(String.valueOf((int)HSB[i]));
            }
        } else {
            // HSB has changed, update RGB
            c = Color.getHSBColor((float)value[0] / 360,
                (float)value[1] / 100, (float)value[2] / 100);
            // reset RGB fields
            RGBcontrols.tfield[0].setText(String.valueOf(c.getRed()));
            RGBcontrols.tfield[1].setText(String.valueOf(c.getGreen()));
            RGBcontrols.tfield[2].setText(String.valueOf(c.getBlue()));
        }
        // update swatch
        swatch.setBackground(c);
        swatch.repaint();
    }
}
class SwingColorControls extends JPanel
    implements ActionListener, FocusListener {
    SwingColorTest frame;
    JTextField[] tfield = new JTextField[3];
    SwingColorControls(SwingColorTest parent, String[] label) {
        frame = parent;
        setLayout(new GridLayout(3, 2, 10, 10));
        for (int i = 0; i < 3; i++) {
            tfield[i] = new JTextField("0");
            tfield[i].addFocusListener(this);
            tfield[i].addActionListener(this);
            add(new JLabel(label[i], JLabel.RIGHT));
            add(tfield[i]);
        }
    }
    public Insets getInsets() {
        return new Insets(10, 10, 0, 0);
    }
    public void actionPerformed(ActionEvent evt) {
        if (evt.getSource() instanceof JTextField)
            frame.update(this);
    }
    public void focusLost(FocusEvent evt) {
        frame.update(this);
    }
    public void focusGained(FocusEvent evt) { }
}
class ExitWindow extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
}

 ha scritto nel messaggio
news:f45c5600.01101...@posting.google.com...
