2013-04-25 143 views
1

我是Java新手,現在正在學習初學者課程。非常好,我正在嘗試各種各樣的東西,但現在我卡住了。 這段代碼不起作用。它應該以相反的順序(通過文字)輸出輸入。靜態和非靜態故障

代碼翻轉它工作在一段代碼,我寫了沒有GUI,現在我想要得到它的GUI工作,有固定按鈕,標籤等 對於我已經複製的例子從互聯網,並試圖改變它的方式,它會工作。但它似乎沒有找到我在actionPerformed中使用的變量,並在AddComponentsToPane中設置。它必須做一些靜態和非靜態的,我似乎無法得到真正清除

任何幫助將不勝感激。

繼承人的代碼。

package flipit; 


import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.*; //ArrayList; 
import javax.swing.*; 

public class FlipIt extends JFrame implements ActionListener { 

public static void addComponentsToPane(Container pane) { 

    pane.setLayout(null); 

    JLabel  greetingLabel = new JLabel("Enter your array "); 
    JTextField inField   = new JTextField(); 
    JTextField commentaryField = new JTextField(); 
    JTextField strLen   = new JTextField(); 
    JButton button   = new JButton("FlipIt"); 

    pane.add(greetingLabel); 
    pane.add(inField); 
    pane.add(commentaryField); 
    pane.add(button);   

    Insets insets = pane.getInsets(); 
    Dimension size = button.getPreferredSize(); 

    greetingLabel.setBounds ( 5 + insets.left, 35 + insets.top,size.width + 40, size.height); 
    inField.setBounds  (120 + insets.left, 33 + insets.top,size.width + 200, size.height); 
    //size = commentaryField.getPreferredSize(); 
    commentaryField.setBounds(120 + insets.left, 80 + insets.top,size.width + 200, size.height); 
    size = button.getPreferredSize(); 
    button.setBounds   ( 5 + insets.left, 80 + insets.top,size.width + 40, size.height); 

} 

private static void createAndShowGUI() { 
    //Create and set up the window. 

    JFrame frame = new JFrame("Reverse the input string."); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //Set up the content pane. 
    addComponentsToPane(frame.getContentPane()); 

    //Size and display the window. 
    Insets insets = frame.getInsets(); 
    frame.setSize(500 + insets.left + insets.right, 
        425 + insets.top + insets.bottom); 
    frame.setVisible(true); 
} 

    public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 

    //Schedule a job for the event-dispatching thread: 
    //creating and showing this application's GUI. 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 

public void actionPerformed(ActionEvent event) { 

    String InputStr = inField.getText(); 
    int length = InputStr.length(); 

    if (InputStr.compareTo("") == 0 || InputStr == null) { 
     commentaryField.setText("Please enter some data, this array is empty"); 
    } 
    else { 

     // Convert string variable to an ArrayList. 
     List<String> list = new ArrayList<String>(Arrays.asList(InputStr.split(" ")));    
     // Converting ArrayList to a String Array 
     String [] InputList = list.toArray(new String[list.size()]); 

     int i = 0 ; 
     String ReverseOrder = "" ; 

     // starting for loop to print the array in reversed order. 
     for (i=InputList.length-1;i>=0; i--) 
      {ReverseOrder = ReverseOrder + " " + InputList[i] ; 
      } 
     // print result. 
      commentaryField.setText(ReverseOrder); 
      strLen.setText("Lengte string : "+ length); 
    } 
    } 
} 

謝謝, Rob。

+3

你得到的錯誤是什麼? – Abubakkar 2013-04-25 09:26:28

+0

不是一個真正的錯誤。我在NedBeans中進行編輯,並且在actionPerformed中使用的變量comnoteField,strLen,inField前面給出了這些紅色氣球。這些說「找不到符號」。 – user2318914 2013-04-25 09:29:11

+0

這意味着錯誤,請發佈您看到的整個錯誤,如「找不到符號.....」 – Abubakkar 2013-04-25 09:30:21

回答

3

主要問題是作用域問題。由於您在addComponentsToPane方法中聲明瞭小部件,因此它們在方法外部不可見。

嘗試移動你的widget聲明的addComponentstoPane方法之外:

JLabel  greetingLabel = new JLabel("Enter your array "); 
JTextField inField   = new JTextField(); 
JTextField commentaryField = new JTextField(); 
JTextField strLen   = new JTextField(); 
JButton button   = new JButton("FlipIt"); 

public static void addComponentsToPane(Container pane) { 

    pane.setLayout(null); 

    pane.add(greetingLabel); 
    pane.add(inField); 
    pane.add(commentaryField); 
    pane.add(button);  
    // etc 
} 

正如您所指出的,雖然(對不起,是我不好!)你的靜態方法將不再有機會獲得小部件(自他們現在是類別實例的一部分)。

思考靜態與非靜態的簡單方法是,如果聲明某些內容爲靜態,則不需要需要一個類實例才能訪問它。因此,在你的代碼,爲什麼你可以這樣做:有效

public void run() { 
    createAndShowGUI(); 
} 

,這將是一樣的這樣做:你沒有創建FlipIt類的實例

public void run() { 
    FlipIt.createAndShowGUI(); 
} 

注;你不需要,因爲createAndShowGUI方法是static。但是,如果它不靜態,那麼你就必須創建一個新的類的實例,如下所示:

public void createAndShowGUI() { 
    // do your thing - note NO LONGER STATIC 
} 

public void run() { 
    // Create instance 
    FlipIt flipper = new FlipIt(); 

    // Invoke method against class instance 
    flipper.createAndShowGUI(); 
} 

那麼 - 爲了得到你的代碼的工作,最好的解決辦法是讓一切非靜態(當然除了main方法,其中必須是是靜態的)。

下面是整個代碼示例全部放在一起 - 請注意,您可能需要使createAndShowGUI方法public - 但我不這麼認爲。我用java編碼已經有一段時間了,所以我不能確定。

package flipit; 


import java.applet.Applet; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.List; 
import java.util.*; //ArrayList; 
import javax.swing.*; 

public class FlipIt extends JFrame implements ActionListener { 
    JLabel  greetingLabel = new JLabel("Enter your array "); 
    JTextField inField   = new JTextField(); 
    JTextField commentaryField = new JTextField(); 
    JTextField strLen   = new JTextField(); 
    JButton button   = new JButton("FlipIt"); 

    public void addComponentsToPane(Container pane) { 
    pane.setLayout(null); 

    pane.add(greetingLabel); 
    pane.add(inField); 
    pane.add(commentaryField); 
    pane.add(button);   

    Insets insets = pane.getInsets(); 
    Dimension size = button.getPreferredSize(); 

    greetingLabel.setBounds ( 5 + insets.left, 35 + insets.top,size.width + 40, size.height); 
    inField.setBounds  (120 + insets.left, 33 + insets.top,size.width + 200, size.height); 
    //size = commentaryField.getPreferredSize(); 
    commentaryField.setBounds(120 + insets.left, 80 + insets.top,size.width + 200, size.height); 
    size = button.getPreferredSize(); 
    button.setBounds   ( 5 + insets.left, 80 + insets.top,size.width + 40, size.height); 
    } 

    private void createAndShowGUI() { 
    //Create and set up the window. 
    JFrame frame = new JFrame("Reverse the input string."); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    //Set up the content pane. 
    addComponentsToPane(frame.getContentPane()); 

    //Size and display the window. 
    Insets insets = frame.getInsets(); 
    frame.setSize(500 + insets.left + insets.right, 
        425 + insets.top + insets.bottom); 
    frame.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent event) { 
    String InputStr = inField.getText(); 
    int length = InputStr.length(); 

    if (InputStr.compareTo("") == 0 || InputStr == null) { 
     commentaryField.setText("Please enter some data, this array is empty"); 

    } else { 

     // Convert string variable to an ArrayList. 
     List<String> list = new ArrayList<String>(Arrays.asList(InputStr.split(" ")));    
     // Converting ArrayList to a String Array 
     String [] InputList = list.toArray(new String[list.size()]); 

     int i = 0 ; 
     String ReverseOrder = "" ; 

     // starting for loop to print the array in reversed order. 
     for (i=InputList.length-1;i>=0; i--) { 
     ReverseOrder = ReverseOrder + " " + InputList[i] ; 
     } 

     // print result. 
     commentaryField.setText(ReverseOrder); 
     strLen.setText("Lengte string : "+ length); 
    } 
    } 

    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 

     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      FlipIt flipper = new FlipIt(); 
      flipper.createAndShowGUI(); 
     } 
     }); 
    } 
    } 
} 

希望有所幫助!

+0

感謝您的回覆。試圖但當然addComponentsPane不喜歡那樣。試圖從它刪除靜態,但然後一切都變成了紅色 – user2318914 2013-04-25 12:30:00

+0

對不起 - 關於 - 我寫了我的答案遲了。我已經修正它指出爲什麼它是錯的;希望這會讓你走。歡迎來到java :-) – gerrod 2013-04-25 21:01:03

+0

嗨Gerrod,非常感謝您的回答,擺脫了NedBeans中的所有錯誤消息。它運行,但沒有做它應該盡的,但至少(這是我理解java的主要問題)我知道更多這種靜態的東西。 – user2318914 2013-04-26 14:58:30