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);  
     }
   }  
}

ありがとう、ロブ。

4

1 に答える 1

3

主な問題は、スコープの問題です。メソッド内でウィジェットを宣言しているため、addComponentsToPaneメソッドの外からは見えません。

ウィジェットの宣言を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();
}

事実上、それはこれを行うことと同じです:

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

FlipIt クラスのインスタンスを作成していないことに注意してください。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();
        }
      });
    }
  }
}

それが役立つことを願っています!

于 2013-04-25T09:37:21.410 に答える