2016-12-23 6 views
1

私はUniの教材割り当てを行っています。割り当てはJPanelでRectangleGUIを作成することですが、作成したボタンに問題があります。JButtonで色を変更し、forループの終了条件を無限に設定します

buttonSOUTHは、次のことを行うことになって:

ユーザーはSOUTH領域でのJButtonをクリックすると、カラー1で満たさ 矩形はカラー2で満たされた矩形はべきであるが、ランダムな色にすべて変更する必要があります 変化しない。 2番目の JButtonをクリックすると矩形がcolor2で塗りつぶされます ランダムな色に変更されますが、最初のクリックでランダムに塗りつぶされた矩形は同じ色を維持してください。 ユーザーは ボタンを無期限にクリックすることができます。クリックするたびに の矩形がランダムな色で塗りつぶされます。

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); 
       } 
      } 
     } 
    } 
} 

しかし、私は、これは無限大になるように設定する方法がわからない

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

:私は、%2は、0と1

はにクラスRandomColorListenerでのactionPerformedメソッド内のコードを変更し、その後boolean status=false;
RectangleGuiクラスにこのプロパティを追加戻りますので、 ( 'i <100'を削除して空にしておけば)forループを無限にします。 – lemuel

+0

私はボタンをクリックするとループ実行が続き、プログラムが終了するまで(私はそれがfor-loop infiniteで普通だと思いますが)本当に必要なのは、毎回color1とcolor2を切り替えることです無制限にボタンをクリックします(ここでは100です)。999999999に設定できますが、無限にするにはどうすればいいですか? –

+0

ああ、私は誤解したと思う。現在のコードで100回だけボタンをクリックできるということですか? – lemuel

答えて

1

for (int i = 0; i < 100; i++) をチェックするために有用ではありませんこの部分。
両方の内部状態チェックが常に実行されます。 color2とcolor1の両方が変わることを意味します。あなたがテストには何も入れていない場合は

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

ありがとう、それは動作します。 –

+0

私はそれを前に疲れましたが、私は "boolean status = false;"という行を追加したので、私はうまく動作しませんでした。 "RandomColorListener"内の "actionPerformed"の –

+0

は、RandomColorListenerクラスではなく、RectangleGuiクラスにboolean status = falseを追加することを意味します。どちらも動作します... – areiilla

関連する問題