Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-06-2009, 11:25   #1
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
[JAVA] Creazione tavolozza colore RGB

Sto implementando un programma che mi consenta di visualizzare su un pannello il colore che selezioni giocando sui parametri RGB, ognuno dei quali è controllato da una JSlider. Cliccando su "Reset" si ritorna alla situazione iniziale.
Tuttavia non capisco perchè muovendo la prima slider mi diventa tutto nero e cliccando su Reset le slider tornano a posto, il colore no...PS: devo ancora lavorare sul Rosso e sul Blu.

Codice:
package esercitazione4;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Esercitazione extends JFrame{

    public static void main(String [] args){

        JFrame x=new JFrame("Colori");
        x.setSize(400, 300);
        x.setResizable(true);
        x.setContentPane(new Dialog());
        x.setDefaultCloseOperation(EXIT_ON_CLOSE);
        x.setVisible(true);
    }
}

public class Dialog extends JPanel {

    JPanel pane;
    JSlider green;
    JSlider red;
    JSlider blue;
    JButton reset;
    int verde=0;
    int rosso=0;
    int blu=0;
    Color colore=new Color(verde,rosso,blu); //dichiaro un nuovo colore, con variabili RGB inizializzate a 0
    static final int MAX=250;
    static final int MIN=0;
    static final int INIT=0;

    public Dialog(){

        this.setLayout(new GridBagLayout());
        GridBagConstraints c=new GridBagConstraints();

        green=new JSlider(MIN,MAX,INIT);
        green.addChangeListener(new Verde());
        green.setName("G");
        green.setMajorTickSpacing(100);
        green.setMinorTickSpacing(50);
        green.setPaintTicks(true);
        green.setPaintLabels(true);
        green.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        c.fill=GridBagConstraints.HORIZONTAL;
        c.ipady=30;
        c.gridx=0;
        c.gridy=0;
        add(green,c);

        red=new JSlider(MIN,MAX,INIT);
        c.fill=GridBagConstraints.HORIZONTAL;
        c.gridx=0;
        c.gridy=1;
        add(red,c);

        blue=new JSlider(MIN,MAX,INIT);
        c.fill=GridBagConstraints.HORIZONTAL;
        c.gridx=0;
        c.gridy=2;
        add(blue,c);

        pane=new JPanel();
        pane.setBackground(Color.WHITE);
        c.fill=GridBagConstraints.BOTH;
        c.gridx=1;
        c.gridy=0;
        c.ipadx=150;
        c.gridheight=3;
        add(pane,c);

        reset=new JButton("RESET");
        reset.addActionListener(new Reset());
        c.fill=GridBagConstraints.NONE;
        c.gridx=0;
        c.gridy=3;
        c.gridwidth=1;
        c.gridwidth=1;
        c.insets.top=5;
        c.anchor=GridBagConstraints.CENTER;
        add(reset,c);
    }

    class Verde implements ChangeListener{

        public void stateChanged(ChangeEvent e) {
            JSlider source=(JSlider)e.getSource();
            if(!source.getValueIsAdjusting()){
                if(colore.getGreen()<255){verde++;}
                pane.setBackground(colore);
                
            }
        }
    }

    class Reset implements ActionListener{

        public void actionPerformed(ActionEvent e) {
            green.setValue(INIT);
            verde=0;
            pane.setBackground(colore);
            
        }
    }

}
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:14   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Tuttavia non capisco perchè muovendo la prima slider mi diventa tutto nero...
Al movimento della slider scatta l'evento ChangeEvent che intercetti nel lister: lì fai un setBackground() passando 'colore' come parametro ma non lo modifichi, perciò rimane uguale a come viene inizializzato, ovvero con tutti i componenti RGB a zero, il che equivale al colore nero.

Il problema è dato dal fatto che tu incrementi un int
Codice:
class Verde implements ChangeListener{

        public void stateChanged(ChangeEvent e) {
            JSlider source=(JSlider)e.getSource();
            if(!source.getValueIsAdjusting()){
                if(colore.getGreen()<255){verde++;}
                pane.setBackground(colore);

            }
        }
    }
ma poi non lo passi al Color che passi al metodo setBackground e ti aspetti che il tuo Color venga modificato: non funziona così, perchè verde, di tipo int, è un tipo primitivo, non una reference...

Quote:
...e cliccando su Reset le slider tornano a posto, il colore no...
Come sopra, modifichi verde, ma verde è solo un int, il Color non cambia.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:23   #3
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
facendo verde++; non vado a modificare il valore che verde ha alla riga 16, e di conseguenza il valore che assume il colore?
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:26   #4
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Inoltre non credo i concetti con cui gestire l'evento ChangeEvent dentro al listener siano corretti per ottenere l'effetto che desideri...

Secondo me devi dare un'occhiata a della documentazione su come usare JSlider.
La versione lunga la trovi sul sito della Sun; una prima versione più breve e abbordabile la trovi sul tutorial di 50 paginette del buon PGI. andare a vanti a caso ti fa solo perdere del tempo che invece potresti usare per leggereti quel breve ma efficace tutorial e risparmiarti tempo e frustrazione futuri

Esempio diretto, leggendo il tutorial di PGI (estratto):
Quote:
...cut...
JSlider
I costruttori di JSlider permettono di creare un selettore verticale o orizzontale (parametro
orientation) e di stabilire il valore minimo ed il valore massimo mostrati nella barra e selezionabili
dall'utente. Quando l'utente interagisce con il selettore spostando il nodo di selezione lo slider
produce degli eventi ChangeEvent quindi per catturare l'interazione utente occorre usare un
javax.swing.event.ChangeListener. Supponedo che slider sia una variabile di tipo JSlider vale il
seguente esempio:
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
int value = source.getValue();
System.out.println(value); //stampa il valore sulla console
}
});
Attraverso lo slider (metodo getValueIsAdjusting) è possibile sapere se un evento ChangeEvent si è
verificato ma l'utente non ha ancora terminato di far scorrere lo slider. Il valore restituito da
getValueIsAdjusting può quindi essere usato per eseguire un certo compito solo quando l'utente ha
effettivamente stabilito un nuovo valore per lo slider e non durante l'interazione.
slider.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
if(!source.getValueIsAdjusting()) {
int value = source.getValue();
JOptionPane.showMessageDialog(source, "Valore: " + value);
}
}
});
...continue...
Io cambierei il tuo listener così:
Codice:
class Verde implements ChangeListener{

        public void stateChanged(ChangeEvent e) {
            JSlider source=(JSlider)e.getSource();
            verde = source.getValue();
            pane.setBackground(new Color(rosso,verde,blu));
        }
    }
Provalo
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:31   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Cory Guarda i messaggi
facendo verde++; non vado a modificare il valore che verde ha alla riga 16, e di conseguenza il valore che assume il colore?
No, perchè vede è di tipo int, non è una reference, cioè non è un oggetto.

Dovresti leggerti qualcosa sul sitema dei tipi in Java e sul passaggio dei parametri ai metodi.

In Java il passaggio dei parametri ai metodi è sempre per copia del valore del parametro.
Nel caso di passaggio di un tipo primitivo, viene copiato il valore della primitiva; nel tuo caso viene copiato il valore di verde (che vale zero) quando invochi la prima volta il costruttore di Color.
Poi tu continui a modificare la variabile 'verde', ma Color internamente ha la sua copia, che non viene modificata.
Ed ecco spiegato perchè il Color resta nero.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:32   #6
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
Sì, in effetti devo ancora leggere il tutorial che mi hai consigliato ho l'esame venerdì e non so se riesco a farcela

comunque mi sa che il grosso problema era che non avevo capito bene come funzionano i metodi dell'interfaccia
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:34   #7
Cory
Member
 
L'Avatar di Cory
 
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
No, perchè vede è di tipo int, non è una reference, cioè non è un oggetto.

Dovresti leggerti qualcosa sul sitema dei tipi in Java e sul passaggio dei parametri ai metodi.

In Java il passaggio dei parametri ai metodi è sempre per copia del valore del parametro.
Nel caso di passaggio di un tipo primitivo, viene copiato il valore della primitiva; nel tuo caso viene copiato il valore di verde (che vale zero) quando invochi la prima volta il costruttore di Color.
Poi tu continui a modificare la variabile 'verde', ma Color internamente ha la sua copia, che non viene modificata.
Ed ecco spiegato perchè il Color resta nero.
grazie della spiegazione, adesso penso di aver capito vedo di ripassare l'argomento! ma se quindi invece di int l'avessi dichiarato come Integer, avrebbe invece funzionato?
Cory è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:38   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Cory Guarda i messaggi
Sì, in effetti devo ancora leggere il tutorial che mi hai consigliato ho l'esame venerdì e non so se riesco a farcela
Sinceramente, 50 pagine, scritte in maniera chiara, con la capacità di esporre i concetti in maniera cristallina come solo una persona che ha completamente padroneggiato i concetti di cui parla e ha una visione di insieme delle cose molto profonda, quale PGI è in ambito Java, ti assicuro che si fa leggere quasi come un buon romanzo (sempre se la programmazione e il linguaggio Java ti appassionano).

Diciamo che ritagliandoti 2-3 orette riusciresti a leggerlo tutto capendolo.
Io questo, a maggior ragione in vista di un esame, lo vedo come un investimento (specie se dovrai ancora avere a che fare con Java in futuro).

Quote:
Originariamente inviato da Cory Guarda i messaggi
comunque mi sa che il grosso problema era che non avevo capito bene come funzionano i metodi dell'interfaccia
Il grosso del problema io lo vedo altrove; come per esempio non avere chiara la differenza tra un tipo primitivo e un tipo reference: queste sono le basi del linguaggio, e sono assolutamente prioritarie rispetto la conoscenza delle librerie.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:46   #9
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Cory Guarda i messaggi
grazie della spiegazione, adesso penso di aver capito vedo di ripassare l'argomento! ma se quindi invece di int l'avessi dichiarato come Integer, avrebbe invece funzionato?
Sarebbe dipeso dal rispetto delle seguenti condizioni:
1) che la classe Color avesse un costruttore (o esponesse altri metodi per specificare le componenti di colore RGB) che prende in ingresso tipi Integer;
2) che la classe Color rispetto al punto 1) prendesse gli Integer per memorizzarli internamente così come sono (come reference, quindi una modifica esterna alla classe agli Integer si rifletterebbe anche internamente, le reference alla fine sono puntatori) e non per estrarne il valore di tipo int e memorizzare quello (come copia di un int esterno che, anche se poi viene successivamente modificato, non si riflette internamente alla classe).

In pratica se vai a vedere i javadoc della classe Color potrai notare dalla mancanza di metodi 'set' per le singole componenti di colore che la classe non è pensata per essere modficabile nel modo in cui vorresti tu.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 26-06-2009, 12:51   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Ah, due dettagli rispetto al sorgente postato al tuo primo post:
- non occorre che chiami setResizable(true) sul JFrame: un JFrame di default è ridimensionabile.
- class Esercitazione e class Dialog sono entrambe dichiarate come public, e questo è un errore: in uno stesso file .java puoi avere solo una classe 'public'.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:27.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v