PDA

View Full Version : [Java] Sale ma non scende....


Ricca86
14-03-2007, 18:57
Ho scritto questo codice java, per creare un indicatore per regolare il volume da tastiera.
Il funzionamento del programma è semplice, ho fatto varie immagini che indicano il livello del volume e quando premo il determinato tasto, il programma chiama l'immagine con una tacca in più o in meno.

Il problema di questo programma è quando deve scendere, in quanto, il frame rimane fisso sull'ultima immagine in aumento. Quello che mi stupisce però, è come possa funzionare quando si cerca di alzare il volume, e non funzioni poi quando si cerca di abbassare il volume, visto che dovrebbe essere il procedimento inverso di quando si alza.

Il programma è fatto senza pannello, cosi da sfruttare la trasparenza dell'immagine ed avere un pannello trasparente.

Questo è il codice :


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;


public class Controller extends JFrame implements KeyListener{

private Image img[] = new Image[9];
private Image image;
private int volume=4;

public Controller(String title){
setTitle(title);
setSize(100,350);
inizializza();
setResizable(false);
setLocation(1150,640);
image=img[volume];
setIconImage(image);
setVisible(true);
addKeyListener(this);
}

public void inizializza(){

img[8]= Toolkit.getDefaultToolkit().getImage("controller massimo.png");
img[7]= Toolkit.getDefaultToolkit().getImage("controller massimo-1.png");
img[6]= Toolkit.getDefaultToolkit().getImage("controller massimo-2.png");
img[5]= Toolkit.getDefaultToolkit().getImage("controller massimo-3.png");
img[4]= Toolkit.getDefaultToolkit().getImage("controller massimo-4.png");
img[3]= Toolkit.getDefaultToolkit().getImage("controller massimo-5.png");
img[2]= Toolkit.getDefaultToolkit().getImage("controller massimo-6.png");
img[1]= Toolkit.getDefaultToolkit().getImage("controller massimo-7.png");
img[0]= Toolkit.getDefaultToolkit().getImage("controller massimo-8.png");


}

public void keyPressed(KeyEvent e){


int keyCode=e.getKeyCode();

if(keyCode==KeyEvent.VK_A){
if(volume<8){
volume++;
System.out.println("Valore volume : "+volume);
image=img[volume];
setIconImage(image);
}
else{
System.out.println("Valore volume : "+volume);
image=img[volume];
setIconImage(image);
}
}else if(keyCode==KeyEvent.VK_B)
{
if(volume>0){
volume--;
System.out.println("Valore volume : "+volume);
image=img[volume];
setIconImage(image);
}else{
System.out.println("Valore volume : "+volume);
image=img[volume];
setIconImage(image);
}
}

}


public void paint(Graphics g) {
g.drawImage(image, 10, 40, this);
repaint();
}

public void keyTyped(KeyEvent e){}

public void keyReleased(KeyEvent e){}



public static void main(String[] args){

Controller pippo=new Controller("Volume");

}
}

^TiGeRShArK^
14-03-2007, 19:49
ad occhio non funziona perchè quello non è il modo corretto di usare il costrutto else if.
Io avrei scritto:

if(keyCode==KeyEvent.VK_A){
if(volume < 8) {
volume++;
System.out.println("Valore volume : "+volume);
image=img[volume];
setIconImage(image);
} else {
System.out.println("Valore volume : "+volume);
}
} else if(keyCode==KeyEvent.VK_B) {
if(volume>0){
volume--;
System.out.println("Valore volume : "+volume);
image=img[volume];
setIconImage(image);
} else {
System.out.println("Valore volume : "+volume);
}
}

Ricca86
14-03-2007, 20:14
L'else if funziona, e questo me lo confermano i vari System.out.println() che ho inserito...

Griffo
14-03-2007, 20:26
Secondo me dovresti riscrivere il metodo repaint.
Il metodo repaint() di jframe mantiene le immagini precedenti quindi quando si toglie una tacca al volume sovrascrive un'altra itacca sulla tacca precedente, le altre tacche non vengono cancellate! Per questo sembra che non ti faccia nulla.
Ora provo a vedere come avevo fatto in precedenza poi ti posto...

Ricca86
14-03-2007, 20:41
ok grazie mille

Griffo
14-03-2007, 20:58
Hum... se tipo provassi a modificare il metodo
public void paint(Graphics g) {
g.drawImage(image, 10, 40, this);
repaint();
}
con
public void paint(Graphics g) {
super.paint(g);
g.drawImage(image, 10, 40, this);
repaint();
}
cambia qualcosa?? Prova un pò...

Ricca86
14-03-2007, 21:20
Cosi come dici tu funziona, però perdo la trasparenza dell'immagine, un modo per far rimanere la trasparenza?

Griffo
14-03-2007, 21:35
Cosi come dici tu funziona, però perdo la trasparenza dell'immagine, un modo per far rimanere la trasparenza?
Azz... sinceramente non mi sono mai imbatuto in questo problema... non saprei, sorry...