2016-12-17 12 views
0

Я пытаюсь написать серверное приложение в Java и создать вектор v1 для хранения всех сокетов, попавших на сервер.Включая JCheckBox в JFrame, когда и когда клиент подключается

Далее я создал arraylist, где я сохранил все свои сокеты клиента как объекты, а затем создал массив JCheckBox, где я его закрепил, чтобы добавить флажок в панель управления JPanel, которая была инициирована в классе contructor, но что-то кажется неправильным и Я не вижу никаких флажков.

import java.util.*; 
import java.net.*; 
import javax.swing.*; 
import java.awt.event.*; 
import java.io.*; 
import java.awt.*; 

class server extends JFrame implements ActionListener { 

    JTextArea t1; 
    PrintWriter pw; 
    JButton b1, b2; 
    static Vector v1 = new Vector(); 
    static ArrayList checks = new ArrayList(); 
    static JPanel controlpanel; 

    server() { 
     setLayout(new FlowLayout()); 
     t1 = new JTextArea(); 
     add(t1); 
     b1 = new JButton("Send to All"); 
     b2 = new JButton("Send"); 
    //b1.addActionListener(this); 
     //b2.addActionListener(this); 
     add(b2, BorderLayout.SOUTH); 

     add(b1, BorderLayout.NORTH); 
     b1.addActionListener(this); 
     b2.addActionListener(this); 
     controlpanel = new JPanel(); 
     controlpanel.setVisible(true); 
     add(controlpanel); 
    } 

    public void actionPerformed(ActionEvent ae) { 

     String m = t1.getText(); 
     if (ae.getSource() == b1) { 
      try { 
       Iterator t2 = v1.iterator(); 
       while (t2.hasNext()) { 
        Socket s = (Socket) t2.next(); 
        pw = new PrintWriter(s.getOutputStream(), true); 
        pw.println(m); 
        pw.flush(); 
        System.out.println("send" + m); 
       } 
      } catch (Exception e) { 
      } 
     } 
     if (ae.getSource() == b2) { 
      try { 
       Iterator itr = checks.iterator(); 
       while (itr.hasNext()) { 
        Socket schecked = (Socket) itr.next(); 
        pw = new PrintWriter(schecked.getOutputStream(), true); 
        pw.println(m); 
        pw.flush(); 
        System.out.println("sent " + m); 

       } 
      } catch (Exception e) { 
      } 
     } 
     t1.setText(""); 
    } 

    public static void main(String z[]) { 

     try { 
      new server().setVisible(true); 
      ServerSocket s = new ServerSocket(2000); 
      while (true) { 
       System.out.println("waiting..."); 
       Socket c = s.accept(); 
       //   System.out.print(c); 
       v1.add(c); 
       for (int i = 0; i < v1.size(); i++) { 
        checks.add(v1.get(i)); 
        //    checks[i].setText()=v1[i]; 
       } 
       JCheckBox checkbox[] = new JCheckBox[checks.size()]; 

       for (int i = 0; i < checks.size(); i++) { 
        // Object o=checks.get(i); 
        checkbox[i] = new JCheckBox(); 
        //    checkbox[i].setText()=checks.get(i).name; 
        controlpanel.add(checkbox[i]); 
        checkbox[i].setSelected(true); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

A) вам необходимо вызвать такие методы, как setVisible на вашем фрейме. B) не смешивайте 5 вещей, которые вы никогда не делали раньше ... Вместо этого читайте/работайте с учебниками, которые показывают, как использовать фреймы. И когда вы получили то, что работает ... Затем добавьте элементы ui динамически. И тогда, когда это сработает ... Добавьте серверную часть. – GhostCat

+0

Я добавил панель управления внутри сервера конструктора, а затем server.setVisible (true) внутри основного метода. @GhostCat –

ответ

1

Как вы добавляете элементы пользовательского интерфейса после того, как JFrame было сделано видимым, необходимо вызвать REVALIDATE() на панели. Кроме того, вы никогда не должны добавлять напрямую из потока, который не является Thread Dispatch Thread. Наконец, он появляется каждый раз, когда новый клиент подключается, вы собираетесь снова добавить все флажки, которые вы уже добавили, плюс один (т. Е. Когда первый клиент подключится, у вас будет 1 флажок, когда второй подключится, вы будете иметь 1 + 2 = 3, когда третий подключается, у вас будет 1 + 2 + 3 = 6 и т. Д.).

Я настоятельно предлагаю вам мысленно пропустить ваш код, инструкцию по инструкции, чтобы узнать, что произойдет. Кроме того, если вы используете достойную среду IDE, вы можете выполнить код в отладчике и проверить содержимое controlPanel. Если вы не используете IDE ... вы должны.

Я не совсем понимаю, что вам нужно проверить [] и v1 [], но при условии, что они вам понадобятся, вместо того, чтобы поддерживать три массива, вы можете определить класс, содержащий переменную для проверки, одну для v1 , и один для флажка и поддерживать единый массив экземпляров таких объектов.

+0

Хороший совет об этом дополнительном новом классе, который он мог бы использовать ... Но этот класс не должен содержать элементы ui. Вы никогда не смешиваете дисплей и «бизнес-логику» – GhostCat

+0

Я подозреваю, что на самом деле ему не нужна какая-либо бизнес-логика, просто состояние уже поддерживается в флажке, но я могу ошибаться. –