1

オブジェクトの配列があります。これらのオブジェクトは単純で、2 つの文字列のみです。これらの文字列の 1 つだけを返す toString() メソッドがあります。

オブジェクトの配列を取得し、それを可視 GUI リストにして、ユーザーがそれらの 1 つを選択できるようにする必要があります。

メインでは、長い文字列を取得し、それを解析してオブジェクトの配列を返すメソッドに送信します。次に、新しい JList を作成して追加し、表示できるようにします。

JList list = new JList(objects);
list.setVisible(true);
add(list);

ただし、何も表示されません。この時点で、既に画面に GUI が表示されています。実際、上記のコードが含まれるクラスは JPanel を拡張します。なぜ何も見えないのかわからないので、何か間違ったことをしていると思います。

編集* *

さて、私の問題は、モデルを設定していなかったことです。ただし、モデルを設定してもまだ結果が得られません。使用しているコードは次のとおりです。

            ScratchItem[] items = listPlaylists(line2);

            DefaultListModel newListModel = new DefaultListModel();
            for(ScratchItem item : items) {
                newListModel.addElement(item);
            }

            JList list = new JList();
            list.setModel(newListModel);
            list.setVisible(true);
            add(list, BorderLayout.SOUTH);
            invalidate();
4

2 に答える 2

3

JList を変更するのではなく、同じ JList を維持し、モデルを変更するだけです。DefaultListModel に新しい文字setModel(...)列を設定し、JList を呼び出すと、準備完了です。

例えば、

DefaultListModel newListModel = new DefaultListModel();
for (String text : newStringArray) {
   newListModel.addElement(text);
}
originalJList.setModel(newListModel);

編集

あなたは次のように述べています:

私はこれをしましたが、まだ何も得られません。更新された質問を確認してください

と:

さて、私の問題は、モデルを設定していなかったことです。ただし、モデルを設定してもまだ結果が得られません。使用しているコードは次のとおりです。

        ScratchItem[] items = listPlaylists(line2);

        DefaultListModel newListModel = new DefaultListModel();
        for(ScratchItem item : items) {
            newListModel.addElement(item);
        }

        JList list = new JList();
        list.setModel(newListModel);
        list.setVisible(true);
        add(list, BorderLayout.SOUTH);
        invalidate();

まだ新しいJListを作成しています。これを行うのではなく、推奨されている元のJList を使用してください。

ScratchItem[] items = listPlaylists(line2);

DefaultListModel newListModel = new DefaultListModel();
for(ScratchItem item : items) {
    newListModel.addElement(item);
}

// JList list = new JList(); // *** don't create a new JList

// originalList refers to the original displayed JList
originalList.setModel(newListModel);

// list.setVisible(true);
// add(list, BorderLayout.SOUTH);
// invalidate();

編集2
コメントで述べます:

元の JList はありません。これは私がプログラムで作成している最初のものです。コンストラクターに追加するだけで、モデルを変更して setVisible(true) にする必要がありますか?

その後、物事はより複雑になっています。質問の更新されたコードは、他のすべてが正しい場合に機能するはずであり、他のすべてが正しくないことを示唆しています。これまでに投稿したコード スニペットに基づいて何が問題なのかを判断するのは困難です。私の提案:

  • 何よりもまず、Swing GUI でビューを交換する必要がある場合は、CardLayout の使用を検討してください。これにより、交換がはるかに簡単になります。
  • 次に、現在の構造に縛られている場合は、できれば問題を示す最小限のコード例SSCCEを投稿して、より多くのコードを表示する必要があります。これにより、コードを実行して変更し、場合によっては修正することもできます。SSCCE 要件に関する多くの重要な詳細が記載されているため、返信する前にリンクをお読みください。
于 2013-06-02T00:49:35.230 に答える
3

いつもの

revalidate();
repaint();

私のために働きます。最初の行はコンテナを再度レイアウトし、2 番目の行はそれを再描画します (ウィンドウのサイズを変更することで、2 番目の行の効果を得ることもできます)。

ただし、毎回リストを置き換えるのではなく、おそらく基になるモデルを変更する必要があります。

「リストの使い方」から、 「モデルの作成」セクションでは、リスト モデルを使い始めることができます。

于 2013-06-02T01:25:52.243 に答える