Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità
NUC 15 Pro e NUC 15 Pro+ sono i due nuovi mini-PC di casa ASUS pensati per uffici e piccole medie imprese. Compatti, potenti e pieni di porte per la massima flessibilità, le due proposte rispondono in pieno alle esigenze attuali e future grazie a una CPU con grafica integrata, accompagnata da una NPU per la gestione di alcuni compiti AI in locale.
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint
Dal palco di Proofpoint Protect 2025 emerge la strategia per estendere la protezione dagli utenti agli agenti IA con il lancio di Satori Agents, nuove soluzioni di governance dei dati e partnership rafforzate che ridisegnano il panorama della cybersecurity
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti
Dopo alcuni anni di assenza dai cataloghi dei suoi televisori, Hisense riporta sul mercato una proposta OLED che punta tutto sul rapporto qualità prezzo. Hisense 55A85N è un televisore completo e versatile che riesce a convincere anche senza raggiungere le vette di televisori di altra fascia (e altro prezzo)
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-06-2009, 10: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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


ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Hisense A85N: il ritorno all’OLED è convincente e alla portata di tutti Hisense A85N: il ritorno all’OLED è convi...
Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Sora 2: la seconda generazione del model...
Nuovo obiettivo FE 100mm F2.8 Macro GM O...
Steelseries Arctis Nova Elite: le prime ...
30 anni di PlayStation da indossare: arr...
Amazon lancia gli Echo più potent...
Amazon rinnova la gamma Fire TV: ecco le...
Ring lancia le sue prime videocamere con...
Blink amplia la gamma di videocamere di ...
Jaguar Land Rover riprende (gradualmente...
HONOR inaugura il primo ALPHA Flagship S...
Yamaha: ecco il brevetto del 'finto moto...
'Console obsoleta e utenti ingannati': u...
Stop al ransomware su Google Drive, graz...
L'IA è la nuova interfaccia utent...
Battlefield 6: confermata la dimensione ...
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: 23:53.


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