0

わかりました。ここの初心者。ユーザーが「ホーム リスト」から食品を選択し、「>>」ボタンをクリックして左側のリストである「ショッピング リスト」に追加する、またはその逆の場所を作成しました。ユーザーがボタンを選択した後にクリックすると、少し危険になり始めますが、うまく機能します。リスト全体を再度出力し、配列として表示します。選択した値を JList に追加したいだけです。コードは次のとおりです。

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import java.util.*;

import javax.swing.JTextField;

public class MAIN extends JFrame {

    Button ltor, rtol;
    JList homelist, shoppinglist;
    DefaultListModel homefoodlist = new DefaultListModel();
    DefaultListModel shoppingfoodlist = new DefaultListModel();
    JTextField foodlog;

    String[] hfood = {"Tuna", "Mayo", "Ketchup", "Sun Flower Oil", "Buscuits", "Cookies", "Turkey"};
    String[] sfood = {"Chocolate", "bread", "Milk", "Toast", "Beef", "Chicken"}; 

    public static void main(String[] args) {

        new MAIN();

    }

    private MAIN(){
        JPanel thepanel = new JPanel();
        thehandler handler = new thehandler();

        this.setLocationRelativeTo(null);
        this.setSize(400, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        this.setTitle("Shopping List");
        this.add(thepanel);

        //Creating the Home List(left list)
        for(String homefood: hfood){
            homefoodlist.addElement(homefood);
        }

        homelist = new JList(homefoodlist);
        homelist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        thepanel.add(homelist);

        //Buttons for moving lists from left to right
        ltor = new Button(">>");
        thepanel.add(ltor);
        ltor.addActionListener(handler);

        rtol = new Button("<<");
        rtol.addActionListener(handler);
        thepanel.add(rtol);

        //Creating the Shopping list(right list)
        for(String shoppingfood: sfood){
            shoppingfoodlist.addElement(shoppingfood);
        }
        shoppinglist = new JList(shoppingfoodlist);
        shoppinglist.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
        thepanel.add(shoppinglist);

    }

        //ActionListener

        private class thehandler implements ActionListener{
            public void actionPerformed(ActionEvent e){
                //The HomeList to the ShoppingList
                if(e.getSource() == ltor){
                    if(homelist.isSelectionEmpty() == false){
                    shoppingfoodlist.addElement(homefoodlist);
                    homefoodlist.remove(homelist.getSelectedIndex());
                    }else{
                        JOptionPane.showMessageDialog(null, "Select a food from either list");
                    }


                }
                if(e.getSource() == rtol){
                    if(shoppinglist.isSelectionEmpty() == false){
                        homefoodlist.addElement(shoppingfoodlist);
                        shoppingfoodlist.remove(shoppinglist.getSelectedIndex());
                        }else{
                            JOptionPane.showMessageDialog(null, "Select a food from either list");
                        }
                }
            }
        }

}
4

2 に答える 2

0

iberbeu が指摘したように、選択したアイテムだけを一方の側から他方の側に移動したかったと思います。複数の選択を許可するため、選択したすべてのアイテムを繰り返して追加する必要があります。

//ActionListener
private class TheHandler implements ActionListener{
    public void actionPerformed(ActionEvent e){
        //The HomeList to the ShoppingList
        if(e.getSource() == ltor){
            if(homelist.isSelectionEmpty()){
                JOptionPane.showMessageDialog(null, "Select a food from either list");
            }else{
                for(int i : homelist.getSelectedIndices()){
                    shoppingFoodList.addElement(homeFoodList.get(i));
                    homeFoodList.remove(i);
                }
            }


        }
        if(e.getSource() == rtol){
            if(shoppingList.isSelectionEmpty()){
                JOptionPane.showMessageDialog(null, "Select a food from either list");
            }else{
                for(int i: shoppingList.getSelectedIndices()){
                    homeFoodList.addElement(shoppingFoodList.get(i));
                    shoppingFoodList.remove(i);
                }
            }
        }
    }
}

その際、よろしければ、いくつかの提案をしたいと思います。

  • Java の命名規則に従って、クラスはキャメル ケースにする必要があります: Main、TheHandler など、変数はキャメル ケースにする必要があります: shoppingFoodList、homeFoodList など
  • 誰もが独自の方法を持っているため、これは議論の余地があります。しかし、コードをより読みやすくするために、絶対に必要な場合 (else ブランチが必要ない場合など) にのみ条件を否定する必要があると考えていifます。上記のメッセージダイアログ
  • コードが機能するようになったら、とif blocksによって実行される両方のアクションの common と duplicateなどのリファクタリングを開始できますが、これは今のところ情報が多すぎるかもしれません>><<

初心者からプロへのレベルアップを頑張ってください

于 2013-10-22T20:36:04.243 に答える
0

ActionListener の次のコードを置き換える必要があります。

shoppingfoodlist.addElement(homefoodlist);
homefoodlist.remove(homelist.getSelectedIndex());

の中へ:

List selectedValues = homelist.getSelectedValuesList();
for (Object object : selectedValues) {
    shoppingfoodlist.add(0,object);
    homefoodlist.remove(homelist.getSelectedIndex());
}

また、2番目の部分:

homefoodlist.addElement(shoppingfoodlist);
shoppingfoodlist.remove(shoppinglist.getSelectedIndex());

の中へ:

List selectedValues = shoppinglist.getSelectedValuesList();
for (Object object : selectedValues) {
    homefoodlist.add(0,object);
    shoppingfoodlist.remove(shoppinglist.getSelectedIndex());
}

ご覧のとおり、2 つの場所で変更を加える必要があります。次のようなアプローチを使用して、条件付きロジックと重複を取り除くために、リスナー コードを少しリファクタリングすることをお勧めします。

class CustomActionListener implements ActionListener{
    JList source;
    JList sink;
    CustomActionListener(JList source, JList sink){
        this.source = source;
        this.sink = sink;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if( !source.isSelectionEmpty() ){
            List selectedValues = source.getSelectedValuesList();
            for (Object object : selectedValues) {
                DefaultListModel sinkModel =  (DefaultListModel) this.sink.getModel();
                sinkModel.add(0, object);
                DefaultListModel sourceModel = (DefaultListModel) this.source.getModel();
                sourceModel.remove(source.getSelectedIndex());
            }       
        }
    }

}

次に、次のように使用できます。

ltor.addActionListener(new CustomActionListener(homelist,shoppinglist));
rtol.addActionListener(new CustomActionListener(shoppinglist,homelist));

コードは簡潔になり、ActionListener で 2 つの場所 (1 つは if(ltor) と 2 番目は if(rtol) ) を維持する必要がなくなります。

于 2013-10-22T20:38:01.397 に答える