Arraylistに関連する別のクラスのメソッドを呼び出す

I am building an application with a Room class which is abstract and a Standard class which inherits from Room. I have then created a Hostel class. Within the Hostel class is ArrayList rooms to which rooms can be added. I have created a method in the Hostel class which shows all available rooms but when I try and instantiate this in another class (MainGUI) nothing is shown. As far as I can see this is because I am creating a new hostel each time I click the button but would like to know how to pass the data across instead of creating a new hostel each time. Below are the relevant snippets of code.

ホステルクラス

public Hostel()
{
    rooms = new ArrayList();
}

public void showAvail()
{
    for (Room room : rooms)
    {
        if (room.available == true) 
        {
                 theString = room.getRoomData() + "\n";
                 //System.out.println("Available Rooms" + "\n" + theString);
                 JOptionPane.showMessageDialog(null,theString);
        }
    }
}

public void addRoom(Room theRoom)
{
    rooms.add(theRoom);
}

MainGUIクラス

roomsFreeB.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        Hostel host = new Hostel();
        host.showAvail();
    }
});

どんな助けもありがとう

0
@ケビン私は、標準クラス内の標準ルームのコンストラクタを持って、その後、ホステルクラスの配列リストに追加されます
追加された 著者 Darren Burgess,
私はあなたの助けと忍耐のおかげで、最初からこれを見て、私のデザインを変更する必要がある気分を得る
追加された 著者 Darren Burgess,
毎回新しい Hostel インスタンスを作成せずに Hostel クラスからメソッドを呼び出す方法はありますか?
追加された 著者 Darren Burgess,
はい、それは絶対にうまく動作します、これが私がとても混乱している理由です。
追加された 著者 Darren Burgess,
BlueJ内ではIDE内でクラスのオブジェクトを作成できるので、 Hostel オブジェクト Standard オブジェクトを作成してから addRoom()メソッドを呼び出してarraylistに移入するホステルオブジェクト
追加された 著者 Darren Burgess,
@ケビンあなたはIDE BlueJに精通していますか?
追加された 著者 Darren Burgess,
私は部屋のコンストラクタを追加しました。
追加された 著者 Darren Burgess,
部屋を追加したオブジェクトに showAvail()を呼び出そうとしましたか?
追加された 著者 Kevin,
これをそのまま実行すると、ホステルに客室が追加されません。それはあなたが手動で部屋を追加した同じインスタンスを取ることはありません、それは新しいものを作成します。そのインスタンス( ActionListener の中の host )の作成とルームの追加とそれを続けるか、(これは特にデバッグのために望ましい)ここで)、コードを作成して部屋を一覧表示する間に、いくつかの部屋を追加します。
追加された 著者 Kevin,
私はそれについて聞いたことがあります、私は vim を使用します。しかし、あなたのIDEはこの質問のために重要ではありません。どうして?
追加された 著者 Kevin,
Hostel クラスのすべてを静的にすることはできますが、それは素晴らしいアイデアだとは思いません。おそらく、 MainGUI 内でインスタンス変数を使用し、そのインスタンスのメソッドを呼び出す必要があります。
追加された 著者 Kevin,
addRoom()はコンストラクタではなくメソッドです。自動的に呼び出されることはなく、あなたが投稿したコードでは決して呼び出さないので、 Hostel とその room Room それが追加されました。
追加された 著者 Kevin,
それらはコンストラクタの Hostel に追加されていますか?もしそうなら、そのコードも投稿してください。そうでなければ、それはあなたの問題です。 Room を追加するコードは決して呼び出されません。
追加された 著者 Kevin,
room はどこで埋めていますか?
追加された 著者 Kevin,

6 答え

あなたが Hostel host = new host(); host.showAvail(); の間のコードを省略しない限り、 (または何でも)表示することができます。作成後、 showAvail の前に部屋を host に追加するか、 Hostel インスタンス変数を作成し、その上で showAvail を呼び出します。

1
追加された

あなたの問題はまさにあなたが思っていた問題です。ボタンをクリックするたびに新しいArrayListを作成しているので、データが表示されません。まず MainGUI クラスに hostel オブジェクトを作成し、

プライベートホステルホステル;

これにより、以前に入力した情報を参照することができます

0
追加された

毎回新しいホステルを作っているからです。 ArrayListに Room が存在すると思います。

あなたはactionPerformedの外にホステルオブジェクトを作成する必要があります。そしてあなたの場合、それは1回だけ作成されるべきです。この作成されたHostelオブジェクトに Room オブジェクトを追加します。

質問がどこにあるのか..それはあなたに残されています。それはあなたのデザインにあります。

たとえばそれは可能です。

ABC というクラスを作成して、その中にホステルオブジェクトを作成することができます。 getHostel()という静的メソッドを記述します。その後、ABC.getHostel()を呼び出します。

0
追加された

はい、あなたは毎回の行動が行われ、新しいホステルが作成され、ホステルに関連付けられた部屋のリストも作成されることが正しいです。

ボタンをクリックすると、あなたが見たいホステル(あなたのアプリケーションデータベースなどを読んでいるかもしれません)を知ることができます。初めてホステルに空き部屋がある場合、そうでなければあなたが知っているホステル情報を読むホステルに属する部屋については、コンストラクターまたはセッターメソッドを使用してホステルオブジェクトに渡すことができます。

コードスニペット:

createHostel(String hostelName) {
   //read from database
   //No hostel with hostelname found create a new hostel else if hostel is found send   the same (by this time hostel object would have room information also
}

あなたの行動

public void actionPerformed(ActionEvent actionEvent) {
   //MyFactory.getHostel(String hostelName)
   //Once you have hostel object call showAvail on it, if its new you will get nothing else you will get all the rooms available
}

これはあなたにいくつかの洞察を与えることを望みます。

0
追加された
 public void actionPerformed(ActionEvent e)
{
    Hostel host = new Hostel();
    host.showAvail();
}

前のコードでは、オブジェクトが作成され、メソッドが完了すると破棄されます。変数 host はローカル変数であり、その結果メソッドの実行中にのみ存在します。

あなたがやりたいことに応じて、メイン変数の中にホスト変数を宣言するか、mainメソッドの中にホステルの配列を再度宣言する必要があります。

0
追加された
私はホステルクラスからホステルを作成する、このホステルはそれに部屋が追加されている、働くことは、追加された部屋がボタンroomsFreeBのクリックで表示されることを意味する
追加された 著者 Darren Burgess,
実行されたアクションでは、私は動作するメソッドが好きで、showAvailメソッドのようにJOptionPane経由で利用可能な部屋を表示します
追加された 著者 Darren Burgess,
Hostel の作成とその部屋の表示の間に host.addRoom()メソッドを呼び出さないので、部屋を追加することはありません。
追加された 著者 Kevin,
@ジョンドゥー:働くことによって、あなたはJOptionPaneが表示されていないことを意味しますか?
追加された 著者 VirtualTroll,
@ジョンドゥ:コンストラクタは、部屋のarraylistを初期化するが、部屋が表示されないため、あなたのプログラムは何も表示されないように部屋を作成しない
追加された 著者 VirtualTroll,

ホステルの中であなたの部屋を初期化する方法を見て良いでしょう。一度だけホステルを初期化したい場合は、リスナーの外でそれを行います。この場合、MainGUI内のフィールドであってはなりません。

0
追加された
私のホステルクラスの中で私はメソッドshowAvail()を呼び出すことができ、利用可能な部屋が表示されます、それは私が試みて、MainGUIクラスでこれを行います。
追加された 著者 Darren Burgess,
私は配列リストがホステルクラス内で初期化される場所を示すコードを編集しました
追加された 著者 Darren Burgess,
私はあなたが確かであるかどうか、その部屋が作成され、そのArrayListに追加されたのかどうか疑問に思っただけですか?
追加された 著者 Romczyk,