Раскрывающийся список JComboBox остается пустым, даже когда я добавляю в него элементы - PullRequest
0 голосов
/ 03 мая 2020

В методе Build GUI в классе ChatFrame есть JCombobox с именем dropdown, который я пытался заполнить массивом из класса populate. Но всякий раз, когда я запускаю класс, list успешно выбирает данные, которые я хочу добавить в JComboBox, но не добавляет их в комбинированный список.

Поле со списком остается пустым. Я попытался добавить элемент к этому dropdown.addItem("String");. Это работало, но почему это не работает, когда я использую araylist из другого класса или того же класса, используя для l oop?

Вот код:

// Class to manage Client chat Box.
public class ChatClient {

    /** Chat client access */
    static class ChatAccess extends Observable {
        private Socket socket;
        private OutputStream outputStream;

        @Override
        public void notifyObservers(Object arg) {
            super.setChanged();
            super.notifyObservers(arg);
        }

        /** Create socket, and receiving thread */
        public void InitSocket(String server, int port) throws IOException {
            socket = new Socket(server, port);
            outputStream = socket.getOutputStream();

            Thread receivingThread = new Thread() {
                @Override
                public void run() {
                    try {
                        BufferedReader reader = new BufferedReader(
                                new InputStreamReader(socket.getInputStream()));
                        String line;
                        while ((line = reader.readLine()) != null)
                            notifyObservers(line);
                    } catch (IOException ex) {
                        notifyObservers(ex);
                    }
                }
            };
            receivingThread.start();
        }

        private static final String CRLF = "\r\n"; // newline

        /** Send a line of text */
        public void send(String text) {
            try {
                outputStream.write((text + CRLF).getBytes());
                outputStream.flush();
            } catch (IOException ex) {
                notifyObservers(ex);
            }
        }

        /** Close the socket */
        public void close() {
            try {
                socket.close();
            } catch (IOException ex) {
                notifyObservers(ex);
            }
        }
    }

    /** Chat client UI */
    static class ChatFrame extends JFrame implements Observer {

        private JTextArea textArea;
        private JTextField inputTextField;
        private JButton sendButton;
        private ChatAccess chatAccess;
        private JList<String> list;
        public DefaultComboBoxModel<String> mod;
        private JScrollPane jscrollpane;
        public static JComboBox<String> dropdown;
        //clientThread ct=new clientThread();
        public static  ArrayList<String> usr=new ArrayList<String>();
        public static String array[]=new String[usr.size()];

        public ChatFrame(ChatAccess chatAccess) {
            this.chatAccess = chatAccess;
            chatAccess.addObserver(this);
            buildGUI();
        }

        /** Builds the user interface */
        private void buildGUI() {

            for(int j =0;j<usr.size();j++){
              array[j] = usr.get(j);
              System.out.print("testing"+array[j]);
            }

            //usr=clientThread.acces();
            //System.out.print("test"+usr);

            mod = new DefaultComboBoxModel<String>();

            list = new javax.swing.JList<>(mod);
            list.setBounds(30, 30, 30, 30);

            textArea = new JTextArea(20, 50);
            textArea.setEditable(false);
            textArea.setLineWrap(true);
            add(new JScrollPane(textArea), BorderLayout.WEST);
            jscrollpane=new JScrollPane();
            jscrollpane.setViewportView(list);
            add(new JScrollPane(list), BorderLayout.EAST);
            Box box = Box.createHorizontalBox();
            add(box, BorderLayout.SOUTH);
            inputTextField = new JTextField();
            dropdown=new JComboBox(array);
            dropdown.setBounds(24, 138, 72, 20);
            dropdown.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXXX");

            sendButton = new JButton("Send");
            box.add(inputTextField);
            box.add(sendButton);
            box.add(dropdown);
            box.add(populate.dl);


            ActionListener sendListener = new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String str = inputTextField.getText();
                    if (str != null && str.trim().length() > 0)
                        chatAccess.send(str);
                    inputTextField.selectAll();
                    inputTextField.requestFocus();
                    inputTextField.setText("");
                }
            };
            inputTextField.addActionListener(sendListener);
            sendButton.addActionListener(sendListener);

            this.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    chatAccess.close();
                }
            });
        }

        /** Updates the UI depending on the Object argument */
        public void update(Observable o, Object arg) {
            final Object finalArg = arg;
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    textArea.append(finalArg.toString());
                    textArea.append("\n");
                }
            });
        }
    }

    static class populate{   
        public static ArrayList<String> naam=new ArrayList<String>();
        public static JComboBox<String> dl=new JComboBox<String>();
        public void getarr(String name) {

            naam.add(name);
            System.out.print("populate"+naam);
            dl=new JComboBox<String>();
            dl.addItem(name);
            //ChatFrame.usr.add(name);         
            //System.out.print("chatframeclass"+ChatFrame.usr);
        }
    }

    public static void main(String[] args) {
        String server = args[0];
        int port =2222;
        ChatAccess access = new ChatAccess();
        JFrame frame = new ChatFrame(access);
        frame.setTitle("MyChatApp - connected to " + server + ":" + port);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);

        try {
            access.InitSocket(server,port);
        } catch (IOException ex) {
            System.out.println("Cannot connect to " + server + ":" + port);
            ex.printStackTrace();
            System.exit(0);
        }
    }
} 

1 Ответ

2 голосов
/ 03 мая 2020

Проблема с вашим кодом в том, что array пусто, когда вы добавляете его к dropdown в следующей строке:

dropdown=new JComboBox(array);

Это можно проверить, напечатав array например System.out.println(Arrays.toString(array)); перед добавлением в dropdown.

Ниже приведен минимальный воспроизводимый пример того, как работает добавление массива String к JComboBox<String>:

String[]arr= {"Hello","Hi","Bye"};
dropdown = new JComboBox(arr);

В GUI вы увидите, что dropdown заполнен элементами arr[]. Если вы замените вышеуказанный код следующим образом

String[]arr= {};
dropdown = new JComboBox(arr);

, вы обнаружите, что dropdown стало пустым.

...