個別のメソッド呼び出しによって配列データが失われるのを防ぐにはどうすればよいですか?

ジョナサン八重洲

複数の方法で使用できる配列を作成したいと考えています。グローバル配列を作成してこれを試みました。しかし、配列にデータを追加するメソッドが実行されて終了すると、データが失われ、すべてが再びnullになることがわかりました。

配列はここで初期化されます:

package book;

import book.BookIO;
import java.awt.BorderLayout;
import java.awt.*;
import javax.swing.*;
import java.awt.GridBagLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

/**
 *
 * 
 */
public class UserInterface implements ActionListener {
    int j=0;
    int i;

    //Containers 
    String hello;
    JFrame frame = new JFrame("Java Program");
    JPanel toppane = new JPanel(new GridBagLayout());
    JPanel bottomPane = new JPanel(new GridBagLayout());
    //Buttons
    JButton processItem = new JButton("Process Item #1");
    JButton confirmItem = new JButton("Confirm Item #1");
    JButton viewOrder = new JButton("View Order");
    JButton finishOrder = new JButton("Finish Order ");
    JButton newOrder = new JButton("New Order");
    JButton exit = new JButton("Exit");
    //TextFields
    JTextField amount = new JTextField();
    JTextField id = new JTextField();
    JTextField quantity = new JTextField();
    JTextField info = new JTextField("");
    JTextField total = new JTextField();
    //Labels
    JLabel num = new JLabel("Enter Number of Items in this Order:");
    JLabel bookID = new JLabel("Enter Book ID for Item #1:");
    JLabel quantityItem = new JLabel("Enter Quantity for Item #1:");
    JLabel itemInfo = new JLabel("Item #1:");
    JLabel subtotal = new JLabel("Order subtotal for 0 Items(s):");
    public String[] order = new String[i];
    int k = 0;
    public void startUI() {

        UserInterface gui = new UserInterface();
        gui.bookingUI();

    }

    public void bookingUI() {
        //sets windows, and pane in the UI 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        GridBagConstraints c = new GridBagConstraints();
        frame.setSize(800, 300);

        //adding the labels to the panel
        c.insets = new Insets(5, 0, 0, 0);
        c.gridx = 2;
        c.gridy = 1;
        toppane.add(num, c);
        c.gridx = 2;
        c.gridy = 2;
        toppane.add(bookID, c);
        c.gridx = 2;
        c.gridy = 3;
        toppane.add(quantityItem, c);
        c.gridx = 2;
        c.gridy = 4;
        toppane.add(itemInfo, c);
        c.gridx = 2;
        c.gridy = 5;
        toppane.add(subtotal, c);
        toppane.setBackground(Color.GREEN);
        frame.add(toppane);

        //add textfield to panel
        c.ipadx = 400;
        c.insets = new Insets(5, 10, 0, 0);
        c.gridx = 3;
        c.gridy = 1;
        toppane.add(amount, c);
        c.gridx = 3;
        c.gridy = 2;
        toppane.add(id, c);
        c.gridx = 3;
        c.gridy = 3;
        toppane.add(quantity, c);
        c.gridx = 3;
        c.gridy = 4;
        toppane.add(info, c);
        c.gridx = 3;
        c.gridy = 5;
        toppane.add(total, c);

        //----------------------------------------------------------BUTTOM PANE-------------------------
        //adding the buttons to the pane.---------------------------------------------------------------
        GridBagConstraints b = new GridBagConstraints();
        b.insets = new Insets(5, 5, 5, 5);
        b.ipadx = 10;
        b.ipady = 10;
        b.gridx = 1;
        b.gridy = 0;
        bottomPane.add(processItem, b);
        processItem.addActionListener(this);
        b.gridx = 2;
        b.gridy = 0;
        bottomPane.add(confirmItem, b);
        confirmItem.setEnabled(false);
        confirmItem.addActionListener(this);
        b.gridx = 3;
        b.gridy = 0;
        bottomPane.add(viewOrder, b);
        viewOrder.setEnabled(true);
        viewOrder.addActionListener(this);
        b.gridx = 4;
        b.gridy = 0;
        bottomPane.add(finishOrder, b);
        finishOrder.setEnabled(true);
        finishOrder.addActionListener(this);
        b.gridx = 5;
        b.gridy = 0;
        bottomPane.add(newOrder, b);
        newOrder.addActionListener(this);
        b.gridx = 6;
        b.gridy = 0;
        bottomPane.add(exit, b);
        exit.addActionListener(this);
        bottomPane.setBackground(Color.BLUE);
        frame.add(bottomPane, BorderLayout.SOUTH);
        frame.setSize(810, 310);
        frame.setVisible(true);
    }

    //action listener for the buttons 
    public void actionPerformed(ActionEvent e) {

        int i = Integer.valueOf(amount.getText());
        order = new String[i];

        if (e.getSource() == processItem) {
            processItem();

        } else if (e.getSource() == confirmItem) {
            confirmItem();
            setProcessItemBtn();

        } else if (e.getSource() == viewOrder) {
            System.out.println(order.length);


        } else if (e.getSource() == finishOrder) {

        } else if (e.getSource() == newOrder) {
                newOrder();
        } else if (e.getSource() == exit) {
            System.exit(0);
        }
    }

//Creating getters and setters to change the text for the buttons and labels, as well as getting text from the textfields.
    public void setProcessItemBtn() {
        processItem.setText("Process Item #");
        processItem.validate();
        processItem.repaint();
    }

    public void setConfirmItemBtn(int num) {
        confirmItem.setText("Confirm Item #" + num);
        confirmItem.validate();
        confirmItem.repaint();
    }

    public void setViewOrderBtn(String title) {

        viewOrder.validate();
        viewOrder.repaint();
    }

    public void setInfo(String title, String price) {

        info.setText(title + " " + price);
        info.validate();
        info.repaint();

    }

    public String getAmount() {
        String str = amount.getText();
        return str;
    }
    public void confirmItem(){
        i = Integer.valueOf(amount.getText());
        int amountOrdered = Integer.valueOf(quantity.getText());
        System.out.println(k);



          for (k = 0; k < amountOrdered; k++){
               order[j] = id.getText() + " " + info.getText();

               j++;

          }
           System.out.println(order[2]);
          System.out.println(k);
            if ((i-1)<j){
                processItem.setEnabled(false);
                confirmItem.setEnabled(false);

            }else{
                processItem.setEnabled(true);
                confirmItem.setEnabled(false);
            }



    }
    public void processItem(){
         boolean ifFound  = false;


            confirmItem.setEnabled(true);
            processItem.setEnabled(false);
            BookIO findInfo = new BookIO();
            ifFound = findInfo.readFile(id.getText(), this);

            if (ifFound == true)
                JOptionPane.showMessageDialog(null, "Found it");
            else {
                JOptionPane.showMessageDialog(null, "Book ID " + id.getText() + " not found in file");
                confirmItem.setEnabled(false);
                processItem.setEnabled(true);
            }
    }
    public void newOrder(){

            amount.setText(" ");
            id.setText(" ");
            quantity.setText(" ");
            info.setText(" ");
            total.setText(" ");



    }
}

メソッド(confirmItem)は基本的に、テキストフィールドからユーザー情報を取り込み、それを配列に格納して、後で別のイベントからアクティブ化される別のメソッドにあるメッセージボックスに出力します。このメソッドは、同じテキストフィールドから追加情報を取得するために、プログラムの存続期間中に複数回呼び出されます(これは同じ関連情報です)。ただし、呼び出されたとき、最後のメソッド呼び出しからのデータは配列に存在しません。それは単にnullです。

個別のメソッド呼び出しでデータを失うことなく、データを配列に保持する方法はありますか?この配列は、同じ問題をホストする別のメソッドでも使用されます。

ありがとうございました。

ボアン

UIのいずれかのボタンを押すたびに、actionPerformedメソッドは次の行を実行します。

order = new String[i];

これは、長さの新しい空白の配列を作成しiorder変数を新しい空白の配列を指すように設定して、古い配列が失われるようにすることです。配列拡張する場合は、古い配列の内容を新しい配列にコピーする必要があります。

String[] newOrder = new String[newLength];
System.arraycopy(order, 0, newOrder, 0, order.length);
order = newOrder;

Arrays.copyOf これを1行で行うための標準的で簡単な方法です。

order = java.util.Arrays.copyOf(order, order.length + 1); // increase array length by 1

また、Aを使用Listすると、この種の処理が裸の配列よりも簡単になりorders.add(someNewOrder);ます。これは、次のことを実行できるためです。サイズが自動的に拡張されます。

いずれにせよ、ボタンがクリックされるたびに無条件にやりたいことではないでしょう。ただし、プログラムがどのように動作するのか正確にはわかりません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

メソッド呼び出しを呼び出す代わりにRubyの配列に格納するにはどうすればよいですか?

分類Dev

USB転送でデータが失われるのを防ぐにはどうすればよいですか?

分類Dev

3つのデータメンバーのそれぞれに対してsetメソッドを呼び出して、setメソッドによって設定された値を表示するにはどうすればよいですか?

分類Dev

RabbitMQ Publish and Subscriberパターンを使用しているときに別のメソッドを呼び出すにはどうすればよいですか?

分類Dev

Mockitoを使用して特定のメソッドが呼び出されなかったことを確認するにはどうすればよいですか?

分類Dev

セルフメソッドを呼び出してフラスコ内のデータを取得するにはどうすればよいですか?

分類Dev

EntityFrameworkのメソッドを呼び出してデータを取得するにはどうすればよいですか

分類Dev

CPUの「最大化」を防ぐにはどうすればよいですか:複数のワーカーを非同期的に呼び出し、SemaphoreSlimを使用してスロットルする同期メソッド?

分類Dev

このメソッドを呼び出してこの配列を初期化するにはどうすればよいですか?

分類Dev

配列内のすべての要素に対して、反復せずにメソッドを呼び出すにはどうすればよいですか?

分類Dev

filter()メソッドを使用してJavaScriptの配列の配列から個別の値を取得するにはどうすればよいですか?

分類Dev

Firebaseの `.onCall()`メソッドを呼び出すときに「不正なリクエスト」を防ぐにはどうすればよいですか?

分類Dev

Vue jsのメソッドを呼び出して配列を埋めるにはどうすればよいですか?

分類Dev

any_instanceなしでメソッド呼び出しが行われなかったことを表明するにはどうすればよいですか?

分類Dev

メールが誤って転送されるのを防ぐにはどうすればよいですか?

分類Dev

同じメソッドを複数回呼び出すようにディスパッチし、WPFアプリのパラメーターとして呼び出し順序番号を指定するにはどうすればよいですか?

分類Dev

Javaでは、配列要素の一部を使用して特定のメソッドを呼び出すにはどうすればよいですか?

分類Dev

Pythonでデコレータのメソッドの呼び出し元を取得するにはどうすればよいですか?

分類Dev

ページが更新されたときにデータが失われるのを防ぐにはどうすればよいですか?

分類Dev

メソッド呼び出しを使用して特定のパネルを別のパネルに表示するにはどうすればよいですか?

分類Dev

メソッドチェーンを使用して、関数がコースを実行するのを待ってから再度呼び出す前に、同じJavaScript関数を繰り返し呼び出すにはどうすればよいですか?

分類Dev

Mockitoを使用して列挙型パラメーターでメソッド呼び出しを検証するにはどうすればよいですか?

分類Dev

Jasmine:メソッドが別のクラスの別のメソッドによって呼び出されているかどうかをテストする

分類Dev

あるスレッドが別のスレッドによって使用されている配列を変更するのを防ぐにはどうすればよいですか?

分類Dev

あるスレッドが別のスレッドによって使用されている配列を変更するのを防ぐにはどうすればよいですか?

分類Dev

呼び出されたメソッドが、呼び出し側が既にロックしているのと同じロックを使用する場合に、デッドロックを回避するにはどうすればよいですか?

分類Dev

複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

分類Dev

複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

分類Dev

ボタンのFxmlメソッドがリスナーの前に呼び出されるようにするにはどうすればよいですか?

Related 関連記事

  1. 1

    メソッド呼び出しを呼び出す代わりにRubyの配列に格納するにはどうすればよいですか?

  2. 2

    USB転送でデータが失われるのを防ぐにはどうすればよいですか?

  3. 3

    3つのデータメンバーのそれぞれに対してsetメソッドを呼び出して、setメソッドによって設定された値を表示するにはどうすればよいですか?

  4. 4

    RabbitMQ Publish and Subscriberパターンを使用しているときに別のメソッドを呼び出すにはどうすればよいですか?

  5. 5

    Mockitoを使用して特定のメソッドが呼び出されなかったことを確認するにはどうすればよいですか?

  6. 6

    セルフメソッドを呼び出してフラスコ内のデータを取得するにはどうすればよいですか?

  7. 7

    EntityFrameworkのメソッドを呼び出してデータを取得するにはどうすればよいですか

  8. 8

    CPUの「最大化」を防ぐにはどうすればよいですか:複数のワーカーを非同期的に呼び出し、SemaphoreSlimを使用してスロットルする同期メソッド?

  9. 9

    このメソッドを呼び出してこの配列を初期化するにはどうすればよいですか?

  10. 10

    配列内のすべての要素に対して、反復せずにメソッドを呼び出すにはどうすればよいですか?

  11. 11

    filter()メソッドを使用してJavaScriptの配列の配列から個別の値を取得するにはどうすればよいですか?

  12. 12

    Firebaseの `.onCall()`メソッドを呼び出すときに「不正なリクエスト」を防ぐにはどうすればよいですか?

  13. 13

    Vue jsのメソッドを呼び出して配列を埋めるにはどうすればよいですか?

  14. 14

    any_instanceなしでメソッド呼び出しが行われなかったことを表明するにはどうすればよいですか?

  15. 15

    メールが誤って転送されるのを防ぐにはどうすればよいですか?

  16. 16

    同じメソッドを複数回呼び出すようにディスパッチし、WPFアプリのパラメーターとして呼び出し順序番号を指定するにはどうすればよいですか?

  17. 17

    Javaでは、配列要素の一部を使用して特定のメソッドを呼び出すにはどうすればよいですか?

  18. 18

    Pythonでデコレータのメソッドの呼び出し元を取得するにはどうすればよいですか?

  19. 19

    ページが更新されたときにデータが失われるのを防ぐにはどうすればよいですか?

  20. 20

    メソッド呼び出しを使用して特定のパネルを別のパネルに表示するにはどうすればよいですか?

  21. 21

    メソッドチェーンを使用して、関数がコースを実行するのを待ってから再度呼び出す前に、同じJavaScript関数を繰り返し呼び出すにはどうすればよいですか?

  22. 22

    Mockitoを使用して列挙型パラメーターでメソッド呼び出しを検証するにはどうすればよいですか?

  23. 23

    Jasmine:メソッドが別のクラスの別のメソッドによって呼び出されているかどうかをテストする

  24. 24

    あるスレッドが別のスレッドによって使用されている配列を変更するのを防ぐにはどうすればよいですか?

  25. 25

    あるスレッドが別のスレッドによって使用されている配列を変更するのを防ぐにはどうすればよいですか?

  26. 26

    呼び出されたメソッドが、呼び出し側が既にロックしているのと同じロックを使用する場合に、デッドロックを回避するにはどうすればよいですか?

  27. 27

    複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

  28. 28

    複数のオブジェクトチェーンメソッド呼び出しをコーディングして、複数行のコードにまたがって続行するにはどうすればよいですか?

  29. 29

    ボタンのFxmlメソッドがリスナーの前に呼び出されるようにするにはどうすればよいですか?

ホットタグ

アーカイブ