2012-06-04 43 views
2

似乎我的輸入框似乎出現了兩次,即使他們不應該太。似乎無法弄清楚爲什麼。將是巨大的,如果有人可以幫助:)程序似乎沒有明顯的原因循環

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 

我理解,這是一個非常基本的程序,但我或多或少只是想通過59。基本的東西,學習java。所以希望如果我能理解如何讓一個簡單的程序運行,我可以繼續前進。

+0

Nadim,我想提出一些脫離主題的建議...... 1)使用有意義的變量名稱。儘管'c'和'f'幾乎沒有問題*,'x','y'和'z'確實很糟糕。稱他們爲'celcius','fahrenheit','input','type'等等。2)當你發佈到SO後,在發佈後檢查你的代碼格式 - 你有很多多餘的空白行。 *一條*空行就夠了。您也不需要在方法簽名和開放大括號之間留空行。嘗試構建已建立的佈局樣式。 –

+0

您不需要在標題中加入「[已解決]」 - 只需[接受答案](http://meta.stackexchange.com/a/5235/185290)。 –

+0

@Greg Kopff好的,謝謝你的建議:) – Nadim

回答

7

不要將JOptionPane方法放在paint方法中,除非要將程序凍結到爬網。方法paint(...)應該僅用於繪畫。 paint方法負責繪製組件所持有的所有東西,並且如果不必要地分離它的流,gui將不會及時渲染,或者根本不渲染。

您也無法控制何時調用paint或者甚至會調用paint。正如您所看到的,它不是由您直接調用(而應該是),而是由JVM調用,以響應代碼中的建議(通過調用repaint())或由於操作系統的請求實例如果操作系統發現窗口的一部分是「髒的」,它會執行此操作。事實上,你會發現由於這些原因,最初通常會調用兩次。將該代碼放在其他地方,也許是在init方法中。

此外,這看起來可能是Swing應用程序,而不是AWT應用程序,因爲您在init方法中調用getContentPane()。如果是這樣,請不要直接在JApplet的paint(...)方法中繪製,而應直接在JApplet擁有的JPanel或其他JComponent衍生物的paintComponent(...)方法中繪製。這有幾個原因,但主要的原因是applet的paint(...)方法負責許多你不想冒險的事情,包括繪製邊框和子窗口,而應該重寫僅負責繪製組件的方法。

+0

嗯,我想我可以假裝理解你剛纔所說的一切,但那沒用:p所有真正重要的是我認爲我理解了一件重要的事情。我應該把JOptionPane放在init方法中,而不是在paint中?它應該工作正常嗎?並感謝您的幫助順便說一句:) – Nadim

+1

@Nadim:如果你不明白其他部分,你真的應該花時間來試圖理解它們,因爲它們都包含非常有價值的信息。 –

0

paint()方法將被自動調用,因爲它的功能是用任何更新的圖形上下文來繪製屏幕。在這種情況下,您想要接受來自用戶的輸入並基於此值,您需要顯示一些內容在屏幕上。這是因爲paint方法是一個回調方法多次調用,顯然你的輸入將始終顯示。所以,從paint()取出所有JOptionPane.showInputDialog方法,並將它稱爲其他地方。

相關問題