2017-09-07 3 views
0

J'ai regardé plusieurs des questions semblables et n'ai pas été capable de faire ce travail. J'affiche l'heure et ajoute un compteur qui compte jusqu'à 4 et recommence, mais je ne peux l'obtenir que pour définir la couleur d'arrière-plan de départ. Qu'est-ce que j'oublie ici? J'ai essayé de mettre mes instructions if dans quelques endroits. Tout sauf le changement de couleur fonctionne très bien.J'essaye de changer la couleur de fond d'un JPanel chaque fois qu'un bouton est pressé

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

public class TimeFrame extends JFrame { 
     private static final int FRAME_WIDTH = 250; 
     private static final int FRAME_HEIGHT = 200; 
     private JButton CurrentTime; 
     private JLabel CurrentTimeLabel; 
     private JTextField CurrentTimeField; 
     private int click; 
     private JTextField clicktest; 

     public TimeFrame() { 
      CurrentTimeLabel = new JLabel("The Current Time is: "); 

      createTextField(); 
      createButton(); 
      createPanel(); 

      setSize(FRAME_WIDTH, FRAME_HEIGHT); 
      setSize(250, 200); 
      initialize(); 


     } 
     private void initialize() 
     { 
     click = 0; 
     } 

     private void createTextField() 
     { 
      final int FIELD_WIDTH = 10; 
      CurrentTimeField = new JTextField(FIELD_WIDTH); 
      Date now = new Date(); 
      DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
      CurrentTimeField.setText("" + dateFormat.format(now)); 

      clicktest = new JTextField(FIELD_WIDTH); 
      clicktest.setText(" " + click); 

     } 
     private void createButton() 
     { 
      CurrentTime = new JButton("Display Current Time"); 

      ActionListener listener = new AddCurrentTimeListener(); 
      CurrentTime.addActionListener(listener); 

     } 
     private void createPanel() 
     { 
      JPanel panel = new JPanel(); 
      //panel.addActionListener(backgroundListener); 
      panel.add(CurrentTimeLabel); 
      panel.add(CurrentTimeField); 
      panel.add(CurrentTime); 
      panel.add(clicktest); 
      //int click = 0; 

      if (click == 0){ 
       panel.setBackground(Color.ORANGE); 
      } 
      else if (click == 1) { 
       panel.setBackground(Color.YELLOW); 
      } 
      else if (click == 2) { 
       panel.setBackground(Color.BLUE); 
      } 
      else if (click == 3) { 
       panel.setBackground(Color.GREEN); 
      } 
      else if (click == 4) { 
       panel.setBackground(Color.PINK); 
      } 

      add(panel); 

     } 

     class AddCurrentTimeListener implements ActionListener 
     { 
      public void actionPerformed(ActionEvent event){ 

       new java.util.Date(); 
       Date now = new Date(); 
       DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
       CurrentTimeField.setText("" + dateFormat.format(now));getClass();         
       if (click < 4){ 
        click++; 
       } else { 
        click = click - 4;} 

       clicktest.setText("" + click);getClass(); 

       /** 
       if (click == 0){ 
        panel.setBackground(Color.ORANGE); 
       } 
       else if (click == 1) { 
        panel.setBackground(Color.YELLOW); 
       } 
       else if (click == 2) { 
        panel.setBackground(Color.BLUE); 
       } 
       else if (click == 3) { 
        panel.setBackground(Color.GREEN); 
       } 
       else if (click == 4) { 
        panel.setBackground(Color.PINK); 
       } 
       */ 

       repaint(); 
       } 


      } 

} 
+0

Toute la logique dans votre méthode 'createPanel' pour changer l'arrière-plan doit aller dans les boutons' ActionListener', donc quand vous cliquez sur le bouton, il peut faire quelque chose – MadProgrammer

+0

Bienvenue sur SO. S'il vous plaît voir https://stackoverflow.com/help/someone-answers – c0der

Répondre

1

En ajoutant un JPanel au cadre, vous bloquez effetely les cadres contentPane, cela, en soi, n'est pas une question particulière, sauf que dans votre ActionListener, vous essayez de définir la couleur d'arrière-plan le cadre lui-même. Maintenant, cela ne fonctionne pas, car la trame est composée d'un nombre de composants qui se chevauchent.

The layers of a JFrame

Toute modification apportée à l'arrière-plan du cadre ne sera pas affiché, car il est caché derrière le contentPane. Au lieu de cela, vous devriez changer l'arrière-plan du contentPane. D'accord, mais cela nous ramène au premier problème (le JPanel). Maintenant, vous pouvez faire le JPanel un champ d'instance et changer sa couleur d'arrière-plan dans le ActionListener et cela fonctionnerait, ou vous pouvez vous en débarrasser et simplement changer contentPane de cadre, que vous choisissez est à vous

Pour ma , exemple très simplifié, je l'ai choisi d'utiliser simplement le cadre de contentPane comme il démontre un concept important que vous devez savoir sur les cadres ...

import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 

public class TimeFrame extends JFrame { 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TimeFrame().setVisible(true); 
      } 
     }); 
    } 

    private JButton currentTime; 
    private JLabel currentTimeLabel; 
    private JTextField currentTimeField; 
    private int click; 
    private JTextField clicktest; 

    public TimeFrame() { 
     currentTimeLabel = new JLabel("The Current Time is: "); 

     createTextField(); 
     createButton(); 
     createPanel(); 

     pack(); 
     setLocationRelativeTo(null); 
     initialize(); 

    } 

    private void initialize() { 
     click = 0; 
    } 

    private void createTextField() { 
     final int FIELD_WIDTH = 10; 
     currentTimeField = new JTextField(FIELD_WIDTH); 
     Date now = new Date(); 
     DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
     currentTimeField.setText("" + dateFormat.format(now)); 

     clicktest = new JTextField(FIELD_WIDTH); 
     clicktest.setText(" " + click); 

    } 

    private void createButton() { 
     currentTime = new JButton("Display Current Time"); 

     ActionListener listener = new AddCurrentTimeListener(); 
     currentTime.addActionListener(listener); 

    } 

    private void createPanel() { 
     setLayout(new FlowLayout()); 
     //panel.addActionListener(backgroundListener); 
     add(currentTimeLabel); 
     add(currentTimeField); 
     add(currentTime); 
     add(clicktest); 
    } 

    class AddCurrentTimeListener implements ActionListener { 

     public void actionPerformed(ActionEvent event) { 

      new java.util.Date(); 
      Date now = new Date(); 
      DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
      currentTimeField.setText("" + dateFormat.format(now)); 
      getClass(); 
      if (click < 4) { 
       click++; 
      } else { 
       click = click - 4; 
      } 

      clicktest.setText("" + click); 

      if (click == 0) { 
       getContentPane().setBackground(Color.ORANGE); 
      } else if (click == 1) { 
       getContentPane().setBackground(Color.YELLOW); 
      } else if (click == 2) { 
       getContentPane().setBackground(Color.BLUE); 
      } else if (click == 3) { 
       getContentPane().setBackground(Color.GREEN); 
      } else if (click == 4) { 
       getContentPane().setBackground(Color.PINK); 
      } 
      repaint(); 
     } 

    } 

} 

Avertissement:

Personnellement, j'éviter d'étendre directement d'un JFrame, je t vous enferme dans un seul cas d'utilisation et qui vous fait dépend de la fonctionnalité du cadre (comme d'avoir à utiliser getContentPane)

Personnellement, je commence par un JPanel puis ajouter à ce que chaque conteneur je voulais

+0

Parfait! Merci beaucoup! –