对这个Java循环感到困惑

时间:2016-02-01 21:42:27

标签: java input

我一直试图让这个程序工作多年,每次我尝试添加一个循环,增加进度计数器并刷新主框架,它只是不会显示或它将只保持0和每一个我输入的输入不会影响程序。

public class Progress2 
{

    private JPanel mainPanel = new JPanel(); 

    int progress = 0;
    int prog = 100;
    int count;

    Scanner input = new Scanner(System.in);
    String command = "";

    public Progress2()
    {


        JPanel labelPanel = new JPanel(new GridLayout(0, 11)); // holds the JLabels in a grid   
        Label label1 = new Label("0%");
        Label label2 = new Label("10%");
        Label label3 = new Label("20%");
        Label label4 = new Label("30%");
        Label label5 = new Label("40%");
        Label label6 = new Label("50%");
        Label label7 = new Label("60%");
        Label label8 = new Label("70%");
        Label label9 = new Label("80%");
        Label label10 = new Label("90%");
        Label label11 = new Label("100%");

        Label label12 = new Label(prog +"%");


        labelPanel.add(label1);
        labelPanel.add(label2);
        labelPanel.add(label3);
        labelPanel.add(label4);
        labelPanel.add(label5);
        labelPanel.add(label6);
        labelPanel.add(label7);
        labelPanel.add(label8);
        labelPanel.add(label9);
        labelPanel.add(label10);
        labelPanel.add(label11);
        labelPanel.add(label12);

        label1.setForeground(Color.green);
        label2.setForeground(Color.red);
        label3.setForeground(Color.red);
        label4.setForeground(Color.red);
        label5.setForeground(Color.red);
        label6.setForeground(Color.red);
        label7.setForeground(Color.red);
        label8.setForeground(Color.red);
        label9.setForeground(Color.red);
        label10.setForeground(Color.red);
        label11.setForeground(Color.red);

        mainPanel.add(labelPanel, BorderLayout.LINE_START);


        if(progress>=1){
            label2.setForeground(Color.green);
        }

        if(progress>=2){
            label3.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=3){
            label4.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=4){
            label5.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=5){
            label6.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=6){
            label7.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=7){
            label8.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=8){
            label9.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=9){
            label10.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=10){
            label10.setForeground(Color.green);
            prog=-10;
        }

        if(progress>=11){
            label11.setForeground(Color.green);
            prog=-10;
        }

        while(true){
            for(count =0; count<11; count++){
                Scanner scanner = new Scanner(System.in);
                System.out.println("Do you want to increment?");
                String scan = scanner.nextLine();
                progress++;
            }
        }    
    }

    public JComponent getComponent()
    {
            return mainPanel;
    }



    private static void createAndShowUI()
    {
         JFrame frame = new JFrame("Progress");
         frame.getContentPane().add(new Progress2().getComponent());
         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         frame.pack();
         frame.setLocationRelativeTo(null);
         frame.setVisible(true);
    }

    public static void main(String[] args)
    {

        java.awt.EventQueue.invokeLater(new Runnable()
        {
          public void run()
          {
              createAndShowUI();

          }
     });
   }
}

2 个答案:

答案 0 :(得分:0)

我相信你的印象是,每次更新进度变量时,都会测试所有if语句,并相应地更新GUI。不是这种情况。重写循环如下,您将看到预期的结果:

for(count = 0; count < 11; count++) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("Do you want to increment? ");
    String scan = scanner.nextLine();
    progress++;
    if(progress>=1){
        label2.setForeground(Color.green);
    }
    if(progress>=2){
        label3.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=3){
        label4.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=4){
        label5.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=5){
        label6.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=6){
        label7.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=7){
        label8.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=8){
        label9.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=9){
        label10.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=10){
        label10.setForeground(Color.green);
        prog=-10;
    }
    if(progress>=11){
        label11.setForeground(Color.green);
        prog=-10;
    }
}

答案 1 :(得分:0)

遵循以下流程:

  1. Progress2()类初始化面板和标签,并在constructor中添加组件。直到mainPanel.add(labelPanel, BorderLayout.LINE_START);

  2. 创建一个函数updateUI() 函数void updateUI() {         \获取面板         \从面板获取标签         在上面的blahfunk中提到的那个函数中的``for`循环。 }

  3. 此处的学习点:如何从该面板获取面板和标签。为了更容易检查是否可以将面板和标签声明为Progress2()类的类属性,然后可以定义类方法以返回这些值(getter)

    1. updateUI()函数中createAndShowUI();之后调用main()函数。
    2. 为什么在我按11次输入之前GUI不会出现?

      这是调用更新代码的地方。 frame.getContentPane().add(new Progress2().getComponent());内的new Progress2()这是类Progress2()的构造函数 frame.setVisible(true);负责显示在上述语句之后调用的UI。

      要查看您的代码,请按照上述工作流程查找应该执行的代码。