2013-02-09 101 views
1

過去幾周我已經完成了其他幾個簡單的GUI項目,沒有任何問題,但現在我無法在編譯後顯示程序。我無法弄清楚什麼可能是錯誤的,因爲沒有錯誤被拋出,並且與我上學的其他項目格式幾乎相同。Java - 編譯後不會運行GUI

上哪裏找得到屏幕上的圖形用戶界面的任何指導,將不勝感激,這樣我可能會通過和tweek的事情,我想我把這個之前。

import java.util.Random; 
import java.awt.Container; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 

/*********************************************************************** 
Program Name: ProgramName.java 
Programmer's Name: Student Name 
Program Description: Describe here what this program will do 
***********************************************************************/ 
public class GuessGame extends JFrame{ 

    //Declare GUI components 
    private JFrame mainFrame; 
    private JButton guessButton; 
    private JButton exitButton; 
    private JTextField guessField; 
    private JTextField answerField; 
    private JLabel directionsLabel; 
    private JLabel guessLabel; 
    private JLabel answerLabel; 



    public GuessGame(){ 

     //Initialize window components 
     mainFrame = new JFrame("Number Guessing Game"); 
     exitButton = new JButton("Exit"); 
     guessButton = new JButton("Try your luck"); 
     guessField = new JTextField(4); 
     answerField = new JTextField(50); 
     guessLabel = new JLabel("What is your guess?"); 
     answerLabel = new JLabel("Now it is/isn't"); 
     directionsLabel = new JLabel("Enter a number and then press the" + 
       "guess button until you are correct"); 

     //Build the GUI 
     Container c = mainFrame.getContentPane(); 
     c.setLayout(new FlowLayout()); 
     c.add(directionsLabel); 
     c.add(guessLabel); 
     c.add(guessField); 
     c.add(answerLabel); 
     c.add(answerField); 
     c.add(guessButton); 
     c.add(exitButton); 

     //Set Mnemonics 
     guessButton.setMnemonic('G'); 
     exitButton.setMnemonic('E'); 

     mainFrame.setSize(450, 300); 

     mainFrame.addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent e){ 
       System.exit(0); 
      } 
     }); 

     //Call the handler methods for specific functions 
     GuessButtonHandler ghandler = new GuessButtonHandler(); 
     guessButton.addActionListener(ghandler); 

     ExitButtonHandler ehandler = new ExitButtonHandler(); 
     exitButton.addActionListener(ehandler); 

     FocusHandler fhandler = new FocusHandler(); 
     guessField.addFocusListener(fhandler); 
     answerField.addFocusListener(fhandler); 

    } 

    //Implement actionListener for the Guess button 
    class GuessButtonHandler implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      String instring; 
      int counter = 0; 
      int guess; 
      Random rand = new Random(); 
      int numberToGuess = rand.nextInt(1000); 

      instring = guessField.getText(); 

      guess = Integer.parseInt(instring); 
      counter++; 

      if (guess == numberToGuess){ 
       answerLabel = new JLabel("You win! " + 
     "\nThe number was: " + numberToGuess + 
       "\nIt took you " + counter + " tries"); 
      } 
      else if (guess < numberToGuess){ 
       answerLabel = new JLabel("Too low"); 
      } 
      else if (guess > numberToGuess){ 
       answerLabel = new JLabel("Too high"); 
      }   
     } 
    } 

    //Implement ActionListener for the exit button 
    class ExitButtonHandler implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      System.exit(0); 
     } 
    } 

    //Implement focus listener 
    class FocusHandler implements FocusListener{ 
     public void focusGained(FocusEvent e){ 
      if (e.getSource()== guessField){ 
       answerField.setText(""); 
      } 
      else if (e.getSource() == answerField){ 
       guessButton.requestFocus(); 
      } 
     } 


     public void focusLost(FocusEvent arg0) { 

     } 
    } 

    //Main to run program, call GuessGame method 
    public static void main(String[] args) { 
     new GuessGame(); 
    } 

} 

回答

4

你會想打電話給setVisible(true)上將所有組件添加到它之後的JFrame。該程序不會在數學上知道您想顯示任何東西,除非您明確地告訴它這樣做。

public GuessGame() { 

    // Initialize window components 
    mainFrame = new JFrame("Number Guessing Game"); 

    // ..... etc.... 

    FocusHandler fhandler = new FocusHandler(); 
    guessField.addFocusListener(fhandler); 
    answerField.addFocusListener(fhandler); 

    mainFrame.setVisible(true); 
} 

而且,你不希望有這種類擴展JFrame的,因爲這是沒有必要的。您已經在構造函數中使用了JFrame,因此在類中不需要另一個JFrame。

+0

知道這是如此簡單。我可以發誓它在那裏,但沒有意識到它並沒有在整個過程中。萬分感謝。就擴展的JFrame而言,並不清楚該部分。猜猜這是我認爲需要的東西,因爲它與我們已經完成的其他實驗一樣,儘管其中有其他JFrame。我會用這個改變來解決它,謝謝。 – user1174357 2013-02-09 04:55:13

+0

@ user1174357:當我運行你的代碼時,沒有錯誤,但它只是運行並退出,就是這樣,一個症狀表明Swing線程從未啓動。那時我知道要查找你對'setVisible(...)'的調用。接下來,我們將討論如何使用佈局管理器,以便最終可以在JFrame上調用'pack()'並獲得體面的GUI。 – 2013-02-09 04:57:06