|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
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); } } } |
![]() |
![]() |
![]() |
#2 | ||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
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); } } } Quote:
__________________
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) |
||
![]() |
![]() |
![]() |
#3 |
Member
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?
![]() |
![]() |
![]() |
![]() |
#4 | |
Senior Member
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:
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)); } } ![]()
__________________
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) |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
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) |
|
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
Sì, in effetti devo ancora leggere il tutorial che mi hai consigliato
![]() ![]() comunque mi sa che il grosso problema era che non avevo capito bene come funzionano i metodi dell'interfaccia ![]() ![]() |
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Jan 2009
Città: Trento
Messaggi: 81
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
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). 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) |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
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) |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
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) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:53.