2013-05-01 3 views
0

J'ai une affectation qui demande à une balle de se déplacer sur l'écran en fonction du bouton sur lequel l'utilisateur clique et de l'alternance du rouge et du vert avec le clic d'un autre bouton. Tout fonctionne mais le changement de couleur. J'ai un auditeur et une classe réagissant au clic de bouton mais je ne semble pas obtenir un changement. Existe-t-il un moyen meilleur/plus simple d'accomplir cela?Changement de couleur d'outil à l'aide d'un écouteur d'actions

Merci d'avance pour l'aide!

Code I ont:

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

public class Lab2b extends JFrame { 

Lab2b(){ 
    setTitle("Lab 2"); 
    Lab2Panel p = new Lab2Panel(); 
    add(p); 
} 

public static void main(String[] args){ 

    Lab2b frame = new Lab2b(); 
    frame.setTitle("Lab 2 - Ball Mover "); 
    frame.setLocationRelativeTo(null); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(600, 400); 
    frame.setVisible(true); 
    } 

} 

class Lab2Panel extends JPanel{ 
Lab2Button canvas = new Lab2Button(); 
JPanel panel = new JPanel(); 

Lab2Panel() { 

    setLayout(new BorderLayout()); 

    JButton leftButton = new JButton("left"); 
    JButton rightButton = new JButton("right"); 
    JButton upButton = new JButton("up"); 
    JButton downButton = new JButton("down"); 
    JButton colorButton = new JButton("Change Color"); 

    panel.add(leftButton); 
    panel.add(rightButton); 
    panel.add(upButton); 
    panel.add(downButton); 
    panel.add(colorButton); 

    this.add(canvas, BorderLayout.CENTER); 
    this.add(panel, BorderLayout.SOUTH); 

    leftButton.addActionListener(new LeftListener(canvas)); 
    rightButton.addActionListener(new RightListener(canvas)); 
    upButton.addActionListener(new UpListener(canvas)); 
    downButton.addActionListener(new DownListener(canvas)); 
    colorButton.addActionListener(new ColorChangeListener(canvas)); 
} 


} 

class Lab2Button extends JPanel { 
int radius = 5; 
int x = -1; 
int y = -1; 

protected void paintComponent(Graphics g){ 
    if (x<0 || y<0) { 
     x = getWidth()/2 - radius; 
     y = getHeight()/2 - radius; 
    } 
    super.paintComponent(g); 
    g.setColor(Color.RED); 
    g.drawOval(x,y, 2 * radius, 2 * radius); 


} 

     public void moveLeft(){ 

      x -= 5; 
      this.repaint(); 
     } 

     public void moveRight(){ 

      x += 5; 
      this.repaint(); 
     } 

     public void moveUp(){ 
      y -= 5; 
      this.repaint(); 
     } 

     public void moveDown(){ 
      y += 5; 
      this.repaint(); 
     } 

     public void colorChange(){ 
      this.repaint(); 
     } 



} 

class LeftListener implements ActionListener{ 
    private Lab2Button canvas; 

    LeftListener(Lab2Button canvas) { 
    this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
    canvas.moveLeft(); 
    } 
} 

class RightListener implements ActionListener{ 
    private Lab2Button canvas; 

    RightListener(Lab2Button canvas) { 
     this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
     canvas.moveRight(); 
    } 
} 


class UpListener implements ActionListener{ 
    private Lab2Button canvas; 

    UpListener(Lab2Button canvas) { 
     this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
     canvas.moveUp(); 
    } 
} 



class DownListener implements ActionListener{ 
    private Lab2Button canvas; 

    DownListener(Lab2Button canvas) { 
     this.canvas = canvas; 
    } 

    public void actionPerformed(ActionEvent e){ 
    canvas.moveDown(); 
    } 
} 

class ColorChangeListener implements ActionListener { 
    private Lab2Button canvas; 

    ColorChangeListener(Lab2Button canvas) { 
     this.canvas = canvas; 
    } 
    public void actionPerformed(ActionEvent e){ 
     canvas.colorChange(); 
    } 
} 

Mouvement Bouton Listener Code de classe:

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

class Lab2MoveBallListener extends Lab2Button implements ActionListener { 

    public void actionPerformed(ActionEvent e){ 
     this.moveLeft(); 
    } 
} 

D'accord, a changé ce code:

public void colorChange(){ 
      this.repaint(); 
     } 

Pour cela et il des erreurs sur la compilation avec: erreur: impossible de trouver le symbole if (g.getColor() = Color.RED) {

public void colorChange(){ 

      if (g.getColor() = Color.RED){ 
       g.setColor(Color.GREEN); 
      } 
      else{ 
       g.setColor(Color.RED); 
      } 

      this.repaint(); 
     } 

Répondre

2

Jetez un coup d'œil en utilisant un JColorChooser. Il peut définir la couleur de la balle selon les besoins. Voir How to Use Color Choosers

Ici vous avez codé en dur la couleur rendant impossible la modification de la couleur de la balle. Utilisez une variable de membre de classe Color et attribuez-la à getColor.

En plus: Souvenez-vous de définir la couleur avant appeler drawOval:

g.setColor(ballColor); 
g.drawOval(x, y, 2 * radius, 2 * radius); 
1

Lorsque vous appelez votre méthode colorChange() vous ne dites jamais changer une couleur, vous venez de repeindre l'écran. Vous devez changer la couleur quelque part. Pour ce faire, j'aurais une variable de couleur et une instruction if dans votre méthode ActionPerformed pour le bouton de couleur. Le if aurait booléen que si c'est vrai, définissez la variable de couleur égale à cette couleur, sinon placez-le égal à l'autre couleur. Maintenant au lieu de g.setColor(Color.RED); dans votre paintComponent(), vous auriez g.setColor(colorVariable);. J'espère que cela aide et résout votre problème.