2016-12-23 7 views
1

Ich mache eine Coursework-Zuweisung für die Uni, die Aufgabe ist, ein RectanglesGUI mit JPanel zu erstellen, aber ich habe ein Problem mit den Tasten, die ich erstellt habe.Ändern Sie die Farbe mit JButton, setzen Sie die Endbedingung für die Schleife auf unendlich

Die buttonSOUTH sollte folgend tun:

Wenn der Benutzer klickt auf der JButton im Süden der Region, die mit color1 gefüllten Rechtecken sollten alle in einen zufälligen Farbwechsel, während die Rechtecken mit color2 gefüllt sollte nicht ändern. Eine zweite klicken Sie auf die JButton sollte die Rechtecke mit color2 alle in eine zufällige Farbe ändern, während die Rechtecke mit einer zufälligen Farbe beim ersten Klick gefüllt werden, sollte die gleiche Farbe bleiben. Der Benutzer sollte in der Lage sein, weiterhin unbegrenzt auf die Schaltfläche zu klicken, und mit jedem Klick wird ein Satz Rechtecke mit einer zufälligen Farbe gefüllt.

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

public class RectanglesGUI { 

    JFrame frame; 
    RectangleDrawPanel drawPanel; 
    Color color1 = Color.orange; 
    Color color2 = Color.blue; 


    public static void main (String[] args) { 
     RectanglesGUI gui = new RectanglesGUI(); 
     gui.go(); 
    } 

    //this method sets up the JFrame 
    public void go() { 
     frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     drawPanel = new RectangleDrawPanel(); 
     frame.getContentPane().add(BorderLayout.CENTER, drawPanel); 
     frame.getContentPane().setBackground(Color.black); 

     frame.setSize(600,600); 
     frame.setVisible(true); 

     CreateButton newButton = new CreateButton(); 
     newButton.CreateButton(); 
     frame.repaint(); 

    } 

    // To Create a new Button 
    public class CreateButton { 

     JButton buttonSOUTH; 
     JButton buttonNORTH; 

     public void CreateButton() { 
      buttonSOUTH = new JButton("Change Colors"); 
      buttonSOUTH.setPreferredSize(new Dimension(100, 50)); 
      buttonSOUTH.setVisible(true); 
      frame.add(buttonSOUTH, BorderLayout.SOUTH); 
      buttonSOUTH.addActionListener(new RandomColorListener()); 

      buttonNORTH = new JButton("Reset Colors"); 
      buttonNORTH.setPreferredSize(new Dimension(100, 50)); 
      buttonNORTH.setVisible(true); 
      frame.add(buttonNORTH, BorderLayout.NORTH); 
      buttonNORTH.addActionListener(new ResetListener()); 
     } 

     // ActionListener for buttonSOUTH 
     private class ResetListener implements ActionListener { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       color1 = Color.orange; 
       color2 = Color.blue; 
       frame.repaint(); 
      } 
     } 

     // ActionListener for buttonNORTH 
     private class RandomColorListener implements ActionListener { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       ChangeColor c = new ChangeColor(); 

       for (int i = 0; i < 100; i++){ 
        if (i % 2 == 0) { 
         color1 = c.getColor1(); 
         frame.repaint(); 
        } else { 
         color2 = c.getColor2(); 
         frame.repaint(); 
        } 
       } 
      } 
     } 


     // Change Color Class 
     private class ChangeColor { 

      private Color getColor1(){ 
       Random fill1 = new Random(); 
       color1 = new Color (fill1.nextInt(256), fill1.nextInt(256), 
         fill1.nextInt(256)); 
       return color1; 
      } 

      private Color getColor2(){ 
       Random fill2 = new Random(); 
       color2 = new Color (fill2.nextInt(256), fill2.nextInt(256), 
         fill2.nextInt(256)); 
       return color2; 
      } 
     } 
    } 

    class RectangleDrawPanel extends JPanel { 
     public void paintComponent (Graphics g){ 
      super.paintComponent(g); 
      Graphics2D g2=(Graphics2D)g; 
      int width = getWidth(); 
      int height = getHeight(); 

      for (int i = 0; i < 5; i++) { 
       for (int j = 0; j < 5; j++) { 
        int x = (getWidth()/5) * i; 
        int y = (getHeight()/5) * j; 
        if ((i % 2) == (j % 2)) { 
         g2.setColor(color1); 
        } else 
         g2.setColor(color2); 
        g2.fill3DRect(x,y,width,height,true); 
       } 
      } 
     } 
    } 
} 

Aber ich weiß nicht, wie dies zu setzen unendlich sein

for (int i = 0; i < 100; i++){ 
    if (i % 2 == 0) { 
     color1 = c.getColor1(); 
     frame.repaint(); 
     } 
     else { 
      color2 = c.getColor2(); 
      frame.repaint(); 
     } 
} 
+0

Wenn Sie in die Probe stellen etwas nicht Ausdrucksteil (lösche das 'i <100' und lasse es einfach leer), das macht die for-Schleife unendlich. – lemuel

+0

Ich bin müde, sobald ich auf den Knopf klopfe, wird die Schleifenausführung fortgesetzt und das Programm hängt, bis ich es beende (ich denke, das ist normal mit for-loop unendlich), aber was ich wirklich brauche, ist jedes Mal zwischen color1 und color2 umzuschalten Ich klicke auf den Knopf ohne Einschränkung (was 100 hier ist) Ich könnte es auf 999999999 setzen, aber wie man es unendlich macht? –

+0

Oh, ich glaube ich habe es falsch verstanden. Meinst du, du kannst den Knopf nur 100 Mal mit dem aktuellen Code anklicken? – lemuel

Antwort

1

dieser Teil for (int i = 0; i < 100; i++) nicht nützlich für die Überprüfung ist.
beide Teile innerhalb der Bedingungsprüfung wird immer ausgeführt. Das bedeutet, dass sich sowohl color2 als auch color1 ändern. da i% 2 0 zurück und 1

diese Eigenschaft auf RectangleGui Klasse in der Klasse RandomColorListener zu boolean status=false;
dann Code in Methode ändern actionPerformed hinzufügen:

if (status) { 
     color1 = c.getColor1(); 
     frame.repaint(); 
} else { 
     color2 = c.getColor2(); 
     frame.repaint(); 
} 
    status=!status; 
+0

vielen Dank, es funktioniert. –

+0

Ich habe das vorher müde, aber es hat nicht mit mir funktioniert, weil ich die Zeile "boolean status = false;" in der "actionPerformed" nicht in der "RandomColorListener" –

+0

ich meine hinzufügen Boolean status = false RectangleGui Klasse nicht RandomColorListener Klasse. aber beide werden funktionieren ... – areiilla

Verwandte Themen