2012-06-21 62 views
3

我剛剛開始使用Java,並且以前只使用過PHP - 很難讓我的頭部繞過面向對象的事物。我正在使用Eclipse IDE。爲什麼我真的很簡單的Java程序有時還沒有做,有時甚至沒有做?

我試圖做一個程序,它會告訴你在另一個星球上你的體重 - 似乎很

簡單的全到目前爲止,我所做的是使擺動一半的接口

(是,它叫什麼?)

有時候我運行它,它會像我期望的那樣出現,並帶有標題,文本框等......其他時間(當完全沒有更改時),它只是出現一個空白屏幕 enter image description here

該圖顯示了它在工作時的樣子國王。當它不工作時,只有沒有物體。它大約有20%的時間工作。

我想這可能是因爲我的下拉菜單 - 或者JComboBox中,這一直是這樣一個頭部疼痛 - Eclipse的讓我加上「<對象>」的JComboBox的每個記載之後 - 它說:「JComboBox可一原始類型參考泛型JComboBox應參數化「

我不知道爲什麼這是,我可能只是非常厚,抱歉,如果這是一個愚蠢的問題,但我該如何解決這個問題,我的代碼有什麼問題?

package calc; 

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

public class View extends JFrame { 

static String titleText = "Calculate your Mass on another Plannet"; 

public View(){ 
    super(titleText); 
    setSize(500,400); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 

    FlowLayout flo = new FlowLayout(); 
    setLayout(flo); 

    JPanel inputData = new JPanel(); 


    //Labels 
    JLabel lblTitle = new JLabel (titleText, JLabel.CENTER); 
    lblTitle.setFont(new Font("Arial", Font.BOLD, 24)); 
    JLabel lblInputMass = new JLabel ("Weight", JLabel.LEFT); 
    JLabel lblInputUnits = new JLabel("Units");  


    //Input Boxes and Lists 
    JTextField txtInputMass = new JTextField(5); 

    JComboBox<Object> comInputUnits; 
    String arrUnits[] = {"Kilos", "Stone", "Pounds"}; 
    comInputUnits = new JComboBox<Object>(arrUnits); 
    comInputUnits.setSelectedIndex(1); 


    //Buttons 
    JButton btnCalculate = new JButton("Calculate"); 

    //Append objects 
    add(lblTitle); 
    inputData.add(lblInputMass); 
    inputData.add(txtInputMass); 
    inputData.add(lblInputUnits); 
    inputData.add(comInputUnits); 
    inputData.add(btnCalculate); 

    add(inputData); 


} 
/** 
* @param args 
*/ 
public static void main(String[] args) { 
    View sal = new View(); 


} 

} 

對不起這是相當長的問題,我會很感激任何建議或答案, 正如我所說的,我知道關於Java大麥什麼,我剛剛起步的 - 謝謝:)

+0

恕我直言,你不應該在構造函數中做太多的調用。但這可能無法解決問題。 – iozee

+0

我看不到您將UI組件添加到任何容器的位置。 – maksimov

回答

8

你應該

  • 只操縱event dispatch thread內Swing組件;
  • 只有在所有組件都被添加到框架後才調用setVisible(true);
  • 拼寫行星只有一個n,雖然這不重要。

「Eclipse讓你添加」的<Object>被稱爲泛型類型。閱讀tutorial on generics

+0

謝謝,setVisible(true)在最後修正了:) – Lissy

+0

哪一部分是事件調度線程,我試圖在網上找出來,但是不是很清楚?謝謝 – Lissy

+0

你爲什麼不簡單地按照我的鏈接閱讀教程。這裏都有解釋。 –

3

您需要處理EventDispatchThread(EDT)中的Swing組件。

包裹在一個呼叫的呼叫到new View()SwingUtilities.invokeAndWait()

-1

嘗試了這一點:

public static void main(String[] args) { 
      View sal = new View(); 
      sal.setSize(500, 400); 
      sal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      sal.setVisible(true); 

}

評論這些構造後線:

super(titleText); 
setSize(500,400); 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
setVisible(true); 

。希望幫助。

+0

我試了你的代碼與修訂和它一直工作:) –

+3

-1。擺動組件必須從EDT訪問。而上述改變並沒有改變任何東西。 –

2

始終致電pack()。此版本可靠地工作(至少出現)。

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

public class View extends JFrame { 

    static String titleText = "Calculate your Weight on another Planet"; 

    public View(){ 
     super(titleText); 
     // not now! 
     //setSize(500,400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     //setVisible(true); 

     FlowLayout flo = new FlowLayout(); 
     setLayout(flo); 

     JPanel inputData = new JPanel(); 

     //Labels 
     JLabel lblTitle = new JLabel (titleText, JLabel.CENTER); 
     lblTitle.setFont(new Font("Arial", Font.BOLD, 24)); 
     JLabel lblInputMass = new JLabel ("Weight", JLabel.LEFT); 
     JLabel lblInputUnits = new JLabel("Units");  

     //Input Boxes and Lists 
     JTextField txtInputMass = new JTextField(5); 

     JComboBox comInputUnits; 
     String arrUnits[] = {"Kilos", "Stone", "Pounds"}; 
     comInputUnits = new JComboBox(arrUnits); 
     comInputUnits.setSelectedIndex(1); 

     //Buttons 
     JButton btnCalculate = new JButton("Calculate"); 

     //Append objects 
     add(lblTitle); 
     inputData.add(lblInputMass); 
     inputData.add(txtInputMass); 
     inputData.add(lblInputUnits); 
     inputData.add(comInputUnits); 
     inputData.add(btnCalculate); 

     add(inputData); 

     // force the container to layout the components. VERY IMPORTANT! 
     pack(); 
     setSize(500,400); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     // This is what JB Nizet was alluding to.. 
     // 'start (or update) the GUI on the EDT' 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new View(); 
      } 
     }); 
    } 
} 
+1

-1對於不使用'setLocationByPlatform(true)',LOL,雖然它仍然有我的+1,但有多奇怪:-) –

+1

@nIcEcOw'不包含電池',這是一個預算工作。如果我要去VIP,我會先改變佈局,然後放下框架的「尺寸」,然後......;) –

相關問題