0

別のクラスから配列リストを受け取り、それを新しい配列リストに格納しようとしているメソッドがあります。ボタンをクリックするとメソッドが実行されるはずですが、何も表示されません。代わりに、GUIがフリーズし、実行がハングします。

public class GUI implements ActionListener {

private JFrame frame = new JFrame("Dryck & Ingrediens"); // GUI
private JTextField jtf = new JTextField();// GUI
private JTextArea jl1 = new JTextArea();// GUI
private JList jl = new JList();// GUI
private JButton b = new JButton("Sök");
private JScrollPane js = new JScrollPane(jl);// GUI
private JLabel lab = new JLabel("Ange dryck");//GUI
private JLabel lab1 = new JLabel("Walid Shams");
private JLabel lab2 = new JLabel("Kushtrim Brahimi");
private HashMap<String, ArrayList<String>> drinkar = null;//Controller
private ServerHandler serverH = new ServerHandler();

public GUI() {


    frame.getContentPane().setLayout(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(50, 300, 420, 400);
    frame.setResizable(false);
    frame.setVisible(true);
    js.add(jl);
    js.add(jl1);
    jl1.setEditable(false);
    lab.setBounds(90, 20, 130, 20);
    lab1.setBounds(300, 310, 130, 20);
    lab2.setBounds(300, 330, 130,20);
    jtf.setBounds(50, 40, 150, 40);
    b.setBounds(230, 40, 100, 40);
    jl.setBounds(50, 90, 150, 200);
    jl1.setBounds(210, 90, 150, 200);
    Container con = frame.getContentPane();
    con.setBackground(Color.cyan);



    jtf.addKeyListener(new KeyListener() {

        public void keyTyped(KeyEvent e) {
        }

        public void keyPressed(KeyEvent e) {
        }

        public void keyReleased(KeyEvent e) {

                if (jtf.getText().length() > 0) {
                    serverH.writeMsg(jtf.getText());
                }
                else {
                    String[] empty = new String[]{""};
                    jl.setListData(empty);
                }
        }
    });


    jl.addListSelectionListener(new ListSelectionListener() {

        public void valueChanged(ListSelectionEvent e) {
             if (jl.getSelectedIndex() != -1) {
                 String item = (String) jl.getSelectedValue();
                 jl1.setText("");
                 for (String ingrediens : drinkar.get(item)) {
                     jl1.append(ingrediens + "\n");
                 }
             }else{
                 jl1.setText("");
             }
        }
    });
    frame.add(jtf);
    frame.add(jl);
    frame.add(jl1);
    frame.add(lab);
    frame.add(lab1);
    frame.add(lab2);
    frame.add(js);
    frame.add(b);
}


public void actionPerformed(ActionEvent e) {
    if(e.getSource().equals(b)){
        getArrayList();
    }

}

// tar emot arrayen, lagrar i ny array och visar i JList
public void getArrayList() {

    DefaultListModel model = new DefaultListModel();
    ArrayList<String> drinks = new ArrayList<String>();

    drinks = serverH.receiveArrayList();
    System.out.println("the contents of the list" + drinks);

    for(int i = 0; i < drinks.size(); i++){
        model.addElement(drinks.get(i));
    }
    jl.setModel(model);

}


public static void main(String[] args) {
    GUI g = new GUI();

}

}

これは、私がArraylistを受信しようとしている場所からのserverHandlerクラスです。しかし、それは私のGUIには通っていないようです。

public class ServerHandler  {

private Socket socket;// ServerHandler
private DataInputStream dis;// ServerHandler
private ObjectInputStream ois = null;// ServerHandler
private DataOutputStream dos;// ServerHandler
private HashMap<String, ArrayList<String>> drinkar;

public ServerHandler(){

    socket = new Socket();
    InetSocketAddress ipPort = new InetSocketAddress("127.0.0.1", 4444);
    try {
        socket.connect(ipPort);
        dis = new DataInputStream(socket.getInputStream());
        dos = new DataOutputStream(socket.getOutputStream());
    } catch (Exception e) {
    }
//        new Thread(this).start();
}


public ArrayList<String> receiveArrayList() {
    String fromServer;
    try {
        while ((fromServer = dis.readUTF()) != null) {
            if (fromServer.equals("read")) {
                getArrayList();
            }

        }
    } catch (Exception e) {
    }
    return getArrayList();

}

public void writeMsg(String jtf){

    if (dos != null) {
        if (jtf.length() > 0) {
            try {
                dos = new DataOutputStream(socket.getOutputStream());
                dos.writeUTF(jtf);
            } catch (IOException ex) {
                System.out.print(ex);
            }
        }
    }
}

public ArrayList<String> getArrayList(){

ArrayList<String> arr = new ArrayList<String>();

    try {
        ois = new ObjectInputStream(socket.getInputStream());
        drinkar = (HashMap<String, ArrayList<String>>) (ois.readObject());

        Iterator it = drinkar.keySet().iterator();
        while(it.hasNext()){
            String temp = (String) it.next();
            arr.add(temp);
        }
        System.out.println(arr);


    } catch (ClassNotFoundException ex) {
        System.out.println(ex);
    } catch (IOException ex) {
        System.out.println(ex);
    }

    return arr;

}

public ArrayList<String> drinks(){

    ArrayList<String>arr = new ArrayList<String>();
    return null;

}

public static void main(String[] args) {
    ServerHandler sv = new ServerHandler();
}

}

4

2 に答える 2

1

bJButtonにアクションリスナーを追加することはありません。その結果、ボタンがアクションを開始することはないif(e.getSource().equals(b))ため、は常にfalseになります。bこれがtrueと評価されない場合、メソッドが呼び出されることはありません。

于 2012-08-22T21:57:59.900 に答える
1

OK、要約します。まず、getArrrayListを2回呼び出すのは良い考えではありませんでした。これは、2回目はソケットに何も入っておらず、飲み物を飲み込んだだけだからです...:)whileループ内からgetArrayListを返します。最後のコメントでのあなたの問題について、それは設計上の問題です。マップからも値を返します。キーセットを削除してリストとして返すべきではないと思います(これは、より簡単に行うことができますnew ArrayList(map.keySet()))。代わりにマップ全体を返し、GUIのgetArrayListで分割します

于 2012-08-23T19:36:35.583 に答える