Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding arraylist to Jlist

I have an arraylist in my metod receiveArrayLists which i want to add to a JList. How can i do this?

import java.awt.Dimension;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class GUI implements Runnable {

private Server server;
private JFrame frame = new JFrame();
private JTextField jtf = new JTextField();
private JList jl = new JList();
private JTextArea jl1 = new JTextArea();
private JScrollPane pane = new JScrollPane(jl);
private Socket socket;
private DataInputStream dis;
private ObjectInputStream ois = null;
private DataOutputStream dos;

public GUI() {

    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();


    frame.getContentPane().setLayout(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setBounds(50, 300, 420, 400);
    frame.setResizable(false);
    frame.setVisible(true);
    pane.add(jl);
    pane.add(jl1);
    jl1.setEditable(false);
    jtf.setBounds(50, 40, 150, 40);
    jl.setBounds(50, 90, 150, 200);
    jl1.setBounds(210, 90, 150, 200);


    jtf.addKeyListener(new KeyListener() {

        public void keyTyped(KeyEvent e) {
        }

        public void keyPressed(KeyEvent e) {
        }

        public void keyReleased(KeyEvent e) {
            if (dos != null) {
                if(jtf.getText().length() >0){
                try {
                    dos.writeUTF(jtf.getText());
                } catch (IOException ex) {
                    Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
                }
                }else{
                    jl1.setText("");
                }
            }

        }
    });
    frame.add(jtf);
    frame.add(jl);
    frame.add(jl1);

    frame.add(pane);
}

public void run() {
    String fromServer;
    try {
        while ((fromServer = dis.readUTF()) != null) {
            if (fromServer.equals("read")) {
                receiveArrayList();
            }
        }
    } catch (Exception e) {

    }
}

Here is my metod, as you can see, i try to use append which obviously wont work to add an arraylist to a JList

public void receiveArrayList() {

    try {
        jl1.setText("");
        ois = new ObjectInputStream(socket.getInputStream());
        @SuppressWarnings("unchecked")
        ArrayList<String> a = (ArrayList<String>) (ois.readObject());
        for (int i = 0; i < a.size(); i++) {
            jl.append(a.get(i) + " \n");
        }
        dis = new DataInputStream(socket.getInputStream());
    } catch (ClassNotFoundException ex) {
        System.out.println(ex);
    } catch (IOException ex) {
        System.out.println(ex);
    }
}

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

}
}
like image 280
DrWooolie Avatar asked Feb 02 '26 12:02

DrWooolie


2 Answers

The simplest is to create a DefaultListModel object, iterate through the ArrayList in a for or foreach loop and add the items to the model via its addElement(...) method. Then set the JList's model to your model.

More involved but satisfying is to create your own ListModel by extending AbstractListModel using your ArrayList as the model's nucleus.

like image 117
Hovercraft Full Of Eels Avatar answered Feb 05 '26 02:02

Hovercraft Full Of Eels


You need to make use the JList's list model. The simplest solution is to use DefaultListModel, but you could investigate implementation your own (based on the AbstractListModel)

If you don't want to keep any previous content when you receive the array list you could do the following:

public void receiveArrayList() {

    try {

        DefaultListModel model = new DefaultListModel();
        jl1.setText("");
        ois = new ObjectInputStream(socket.getInputStream());
        @SuppressWarnings("unchecked")
        ArrayList<String> a = (ArrayList<String>) (ois.readObject());
        for (int i = 0; i < a.size(); i++) {
            model.addElement(a.get(i)); // <-- Add item to model
        }
        dis = new DataInputStream(socket.getInputStream());

        jl.setModel(model); // <-- Set the model to make it visible

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

If you want to keep the previous list, then you need to ensure that the original model is a DefaultListModel (in this example) or is compatible with the ListModel you are using.

Basically, then you want to cast the model:

You may want to check out this tutorial for more info. DefaultListModel model = jl.getModel();

Obviously, you won't need to reapply it at the end ;)

like image 43
MadProgrammer Avatar answered Feb 05 '26 01:02

MadProgrammer