2013-10-18 118 views
2

我正在編程一個菜單,以前用於所有基於文本的遊戲。我正在嘗試使用addActionListener在單擊按鈕時打印一行文本,所以我可以計算出將來如何實現我的主代碼。我遇到的問題是在我的JButton上使用addActionListener方法。我正在用JFrame執行所有這些操作。從別人說的話來說,我用這個作爲參數,但得到一個「不能從靜態上下文中引用的非靜態變量」錯誤。這裏是我的代碼:與按鈕一起使用actionListener

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

public class Menu 
{ 



    public static void Menu() 
    { 
     JButton button = new JButton("Click to enter"); 
     button.setBounds(125, 140, 150, 20); 
     JFrame frame = new JFrame("Casino"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(button); 
     button.addActionListener(this); 

     JLabel emptyLabel = new JLabel(""); 
     emptyLabel.setPreferredSize(new Dimension(400, 300)); 
     frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); 

     frame.pack(); 
     frame.setVisible(true); 
    } 



    public void actionPerformed(ActionEvent e) 
     { 
     @Override 
     String s = "Welcome!"; 
     System.out.println(s);  
     } 
} 
+2

別除非你知道你在做什麼,否則使用靜態變量和方法。不要隨機開始編寫GUI程序。首先閱讀[Swing教程](http://docs.oracle.com/javase/tutorial/uiswing/TOC.html)。有很多例子會告訴你如何創建和構建你的程序。 – camickr

回答

3

目前你的程序只不過是一個靜態方法,試圖將這個方法引入這個方法。如果你正在創建最基本的控制檯程序,這樣會很好,比如向用戶詢問兩個數字,然後添加數字並返回答案,但你不再試圖這樣做。相反,您正在嘗試創建一個Swing GUI程序,如果用戶以事件驅動的方式與其交互,則希望更改其狀態,換句話說,如果用戶按下按鈕或選擇菜單項。

你的問題是你試圖將這個簡單的靜態世界與「實例」世界相關聯,但是在靜態的地方,沒有this

由於您的需求和要求變得越來越複雜,您的程序結構將需要更改以反映此情況。這是你做這件事的絕對要求嗎?否 - Turing Equivalence指出可以在單個靜態主要方法中編寫最複雜的程序,但由於複雜性增加,程序將變得難以理解並且幾乎不可能調試。

我特別推薦的是您創建一個或多個行爲良好的面向對象類,包含非靜態變量和非靜態方法的類,並使用它們來構建GUI及其模型(非GUI核GUI程序應該有)。主要的方法也應該是短而短的,並且應該只涉及到創建上面的類,並將GUI設置爲可見的,這就是它。

你想要做的是研究Java的基本概念,特別是如何創建Java類。 Java教程可以幫助你做到這一點。

+0

我不敢相信你輸入了所有的內容:P – MadProgrammer

+2

保留它存儲在剪貼板中,我想你很快就會需要它;) – MadProgrammer

+0

上帝的禮物,給所有人編寫和理解的禮物 – mKorbel

3

這個班有很多問題。

  1. 它不實現ActionListener所以它不能被用來作爲參數傳遞給JButton
  2. Menu方法static修飾符意味着你甚至可以使用this反正
  3. public static void Main不是構造函數,所以要小心
  4. @Override應出現在方法聲明之前,而不是它。

喜歡的東西...

public class Menu implements ActionListener 
{ 

    public Menu() 
    { 
     JButton button = new JButton("Click to enter"); 
     button.setBounds(125, 140, 150, 20); 
     JFrame frame = new JFrame("Casino"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.add(button); 
     button.addActionListener(this); 

     JLabel emptyLabel = new JLabel(""); 
     emptyLabel.setPreferredSize(new Dimension(400, 300)); 
     frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); 

     frame.pack(); 
     frame.setVisible(true); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) 
    { 
     String s = "Welcome!"; 
     System.out.println(s);  
    } 
} 

可能是一個更好的辦法,但我很擔心創建的類中的一個JFrame,但是這只是我...

+0

我添加了缺失的「在Menu類中實現ActionListener「。希望你不介意。 :) – dARKpRINCE