-1

私はJavaが初めてです。

JLists「ショッピング カート」の項目を追加および削除できる2 つを作成しました。

ユーザーがすべてのアイテムを追加したら、submitボタンをクリックして、選択したアイテムを新しいウィンドウに表示できます。

私の最初のリストはitemList(配列からのアイテムが取り込まれます)、2番目のリストはshoppinglist、ユーザーがJButton.

との間で項目を移動するボタンのアクションを処理するために、追加の配列が作成されますJLists。私はいくつかのことを試しましたが、選択されて表示されたアイテムがヒットshopinglistすると新しいウィンドウに表示されることに成功していません。submit

どんな助けでも大歓迎です。

//Create itemList
itemList = new JList(shopping);
contentPane.add(itemList);
itemList.setVisibleRowCount(10);
    itemList.setFixedCellHeight(20);
    itemList.setFixedCellWidth(140);
    itemList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);


    //Add JScrollPane to maintain size
    JScrollPane list1 = new JScrollPane(itemList);
    //contentPane.add(list1);

    //Create shoppingList
    shoppingList = new JList(items);
    contentPane.add(shoppingList);
    shoppingList.setVisibleRowCount(10);
    shoppingList.setFixedCellHeight(20);
    shoppingList.setFixedCellWidth(140);
    shoppingList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

    //Add JScrollPane to maintain size
    JScrollPane list2 = new JScrollPane(shoppingList);

    JPanel buttonPanel = new JPanel();

    //contentPane.add(list2);

    Buttonin = new JButton(">>");
    //Buttonin.setBounds(144, 46, 60, 23);
    Buttonin.addActionListener(this);
    buttonPanel.add(Buttonin);

    ButtonOut = new JButton("<<");
    //ButtonOut.setBounds(144, 80, 60, 23);
    ButtonOut.addActionListener(this);
    buttonPanel.add(ButtonOut);

    JPanel submitPanel = new JPanel();

    submitButton = new JButton("Submit");
    submitPanel.add(submitButton);

    submitButton.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent az) {
            JFrame frame = new JFrame ("Go Shopping!");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(new MyPanel2());
            frame.pack();
            frame.setVisible(true);

        }
    });


    contentPane.add(list1);
    contentPane.add(buttonPanel);
    contentPane.add(list2);
    contentPane.setOpaque(true);
    contentPane.add(submitPanel);
    return contentPane;


}




public void actionPerformed(ActionEvent e) 
{
    int i = 0;

    //When in buttonin is pressed index and value of selected item is output to array

    if (e.getSource() == Buttonin)
    {

        int[] fromindex = itemList.getSelectedIndices();
        Object[] from = itemList.getSelectedValues();

        //add items to the shoppingList
        for (i = 0; i < from.length; i++)
        {
            items.addElement(from[i]);

        }
        //Must remove items that are selected from the itemList
        for (i = (fromindex.length-1); i >= 0; i--)
        {
            shopping.remove(fromindex[i]);
        }

    }   


    //When out button is pressed index and value of selected item is output to new array

    else if (e.getSource() == ButtonOut)
    {
        Object[] to = shoppingList.getSelectedValues();
        int [] toindex = shoppingList.getSelectedIndices();

        //add items to previous list
           for(i = 0; i < to.length; i++)
            {
                shopping.addElement(to[i]);
            }
         //Must remove what's deselected
           for (i = (toindex.length-1); i >= 0; i--)
            {
                items.remove(toindex[i]);
            }
    }

わかりました、我慢してください(Javaには非常に新しいです)これは、ProfileFrameオブジェクトを参照するようにコンストラクターを設定する方法ですか? もしそうなら、新しいコンストラクターを反映するようにメインを変更するにはどうすればよいですか?

public class GoShopping extends JPanel {

private JList shopList;

public GoShopping(ProfileFrame slist) {
//construct components


shopList = new JList(slist.getListModel());
shopList.setBounds(6, 6, 123, 166);//don't worry I'm changing the layout
add(shopList);
}


public static void main (String[] args) {
JFrame frame = new JFrame ("MyPanel");
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

//I need new GoShopping to reflect the new constructor, but not sure how to make it    work
frame.getContentPane().add (new GoShopping());
frame.pack();
frame.setVisible (true);
}
}
4

1 に答える 1

0

MyPanel2 コンストラクターで新しい ProfileFrame オブジェクトを作成していますが、これは視覚化された ProfileFrame オブジェクトと同じインスタンスではないため、その JList のモデルは null になります。悪い解決策は、静的変数を使用することです。これを行わないでください。より良い解決策は、実際に視覚化された ProfileFrame オブジェクトへの参照を MyPanel2 コンストラクターに渡し、このインスタンスからパブリック メソッドを呼び出すことです。

繰り返しますが、ヌル レイアウトと を使用しないでsetBounds(...)ください。必要以上に難しくしたくない場合を除き、代わりにレイアウト マネージャーを使用してください。

于 2012-12-17T12:52:37.530 に答える