【问题标题】:Program seems to be looping for no apparent reason程序似乎无缘无故地循环
【发布时间】:2012-06-04 02:22:41
【问题描述】:

我的输入框似乎出现了两次,尽管它们不应该出现。似乎无法弄清楚为什么。如果有人能帮忙就好了:)

int x; //temperature input
int y; //temperature type
int z; //temperature convert
int c; //temperature celsius 
int f; //temperature fahrenheit 

public void init() 

{
    setSize(500, 500);
    Container c = getContentPane();
    c.setBackground(Color.BLUE);


}

public void paint (Graphics g)

{
    super.paint(g); 

    g.setFont(new Font("Veranda", Font.PLAIN, 20));
    g.setColor(Color.BLACK);

    String number = JOptionPane.showInputDialog("What temperature would you like to convert? (input # of degrees)");
    x = Integer.parseInt(number);   

    String number2 = JOptionPane.showInputDialog("What temperature type are you inputting? 1. Fahrenheit 2. Celsius");
    y = Integer.parseInt(number2);

    if (y==1)
    {
        c=(5/9)*(f-32);

        g.drawString("Your temperature of" + x + "is" + y + "Celsius", 250, 100); 
    }//end if   

    if (y==2)
    { 
        f=(9/5)*c+32;

        g.drawString("Your temperature of" + x + "is" +y + "Fahrenheit", 250, 100);
    }//end if


}//end paint

我知道这是一个非常基本的程序,但我或多或少只是试图通过盯着基本的东西来学习 java。所以希望如果我能理解如何让一个简单的程序运行起来,我就可以继续前进。

【问题讨论】:

  • Nadim,我想提出一些题外话... 1) 使用有意义的变量名。虽然cf 勉强可以,但xyz 真的很糟糕。打电话给他们celciusfahrenheitinputtype 等。 2) 当您发布到 SO 时,请在发布后检查您的代码格式 - 您有很多多余的空行。 一个空行总是足够的。在方法签名和左大括号之间也不需要空行。尝试对已建立的布局样式进行模式化。
  • 您无需在标题中添加“[已解决]” - 只需 accept an answer
  • @Greg Kopff 好的,感谢您的有用建议 :)

标签: java loops if-statement


【解决方案1】:

不要将 JOptionPane 方法放入paint 方法中,除非您想将程序冻结到爬行状态。 paint(...) 方法应该只用于绘画。 paint 方法负责绘制组件所包含的所有内容,如果您不必要地中断其流程,您的 gui 将无法及时呈现,或者根本无法呈现。

您也无法控制何时调用paint,甚至是否会调用它。如您所见,它不是由您直接调用(也不应该是),而是由 JVM 响应代码中的建议(通过调用 repaint())或由于操作系统的请求而调用,例如,如果操作系统发现窗口的一部分是“脏的”,它将执行此操作。事实上,您会发现由于这些原因,它最初经常被调用两次。将该代码放在其他地方,也许在 init 方法中。

此外,这似乎是 Swing 应用程序,而不是 AWT 应用程序,因为您在 init 方法中调用了getContentPane()。如果是这样,请不要直接在 JApplet 的 paint(...) 方法中绘制,而是在 JApplet 拥有的 JPanel 或其他 JComponent 派生类的 paintComponent(...) 方法中绘制。这有几个原因,但主要原因是小程序的paint(...) 方法负责许多您不想冒险搞砸的事情,包括边框和子窗口的绘制,相反,您应该重写一个只负责绘制组件的方法。

【讨论】:

  • 好吧,我想我可以假装理解你刚才所说的一切,但这没有用:p 真正重要的是我认为我理解了一件事,即重要的部分。我应该将 JOptionPane 放在 init 方法中,而不是放在油漆中?它应该可以正常工作吗?顺便说一句,感谢您的帮助:)
  • @Nadim:如果你不理解其他部分,你真的应该花时间尝试理解它们,因为它们都包含非常有价值的信息。
【解决方案2】:

paint() 方法将被自动调用,因为它的功能是使用图形上下文中更新的任何内容来绘制屏幕。在这种情况下,您希望接受来自用户的输入并基于此值,您需要显示屏幕上的东西。这里发生的事情是,由于paint方法是一个回调方法被多次调用,显然您的输入将始终显示。所以,从paint()中取出所有JOptionPane.showInputDialog方法并调用在别的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多