2016-12-17 69 views
0

我試圖用Java編寫服務器應用程序和創建矢量V1來存儲所有擊中服務器的插槽中。包括JCheckBox的在JFrame的是,當一個客戶端連接

接下來我創建了一個ArrayList,將所有的Client套接字存儲爲對象,然後創建一個JCheckBox數組,我循環它以將複選框添加到在類構造器中啓動的JPanel控制面板中,但似乎出錯了,我看不到任何複選框。

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變得可見之後添加UI元素時,您需要在面板上調用revalidate()。你也不應該直接從一個不是Event Dispatch Thread的線程中添加。最後,每當新的客戶端連接時,就會重新添加已添加的所有複選框,再加上一個(即,當第一個客戶端連接時,您將有1個複選框,當第二個連接時,您將擁有1 + 2 = 3,當第三次連接時,你將有1 + 2 + 3 = 6等)。

我強烈建議你的精神通過您的代碼,指令由指令運行,看看會發生什麼。或者,如果您使用的是體面的IDE,則可以逐步調試調試器中的代碼並檢查controlPanel的內容。如果你不使用IDE,你應該。

我不太明白你需要檢查[]和v1 [],但假設你確實需要它們,而不是維護三個數組,你可以定義一個包含一個變量的類,一個用於v1 ,一個用於複選框,並維護這些對象的單個數組實例。

+0

關於他可以使用的額外新類的好建議......但該類不應包含UI元素。你從不混合顯示和「業務邏輯」 – GhostCat

+0

我懷疑其實他不需要任何業務邏輯,只是已經在複選框中保留的狀態,但我可能是錯的。 –