2016-12-17 10 views
0

私は、サーバーアプリケーションをjavaに書き出し、サーバーにヒットしたすべてのソケットを格納するベクトルv1を作成しようとしています。JCheckBoxをクライアントとの接続時にJFrameに組み込む

次に私はオブジェクトとしてすべてのクライアントソケットを保存した後、クラスコンストラクタで開始されたJPanelコントロールパネルにチェックボックスを追加するためにループするJCheckBox配列を作成しましたが、何かが間違っているようですチェックボックスは表示されません。

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

)あなたのフレームでsetVisibleなどのメソッドを呼び出す必要があります。 B)あなたが以前に行ったことのない5つのものをミックスしないでください。代わりにフレームの使い方を示すチュートリアルを読み、作業してください。そしてそれらのことがうまくいったら... UI要素を動的に追加してください。そして、それがうまくいくと....サーバー部分を追加します。 – GhostCat

+0

コンストラクタサーバー内にコントロールパネルを追加し、メインメソッド内でserver.setVisible(true)を追加しました。 @GhostCat –

答えて

1

JFrameが表示された後でUI要素を追加するときは、パネルでrevalidate()を呼び出す必要があります。また、イベントディスパッチスレッドではないスレッドから直接追加しないでください。最後に、新しいクライアントが接続するたびに、既に追加したすべてのチェックボックスに加えて1つ追加します(つまり、最初のクライアントが接続すると1つのチェックボックスが表示されます。 1 + 2 = 3、3回目に接続すると1 + 2 + 3 = 6などとなります)。

何が起こるかを知るために、指示に従って命令を実行することを強くお勧めします。まともなIDEを使用している場合は、デバッガでコードをステップ実行し、controlPanelの内容を調べることもできます。あなたがIDEを使用していない場合は...あなたはすべきです。

[]とv1 []をチェックする必要があるとは分かりませんが、3つの配列を維持する代わりに、チェック用変数、v1用変数1つはチェックボックス用で、このようなオブジェクトのインスタンスの単一の配列を維持します。

+0

彼が使うことができる追加の新しいクラスについての助言...しかし、そのクラスはUI要素を含んではいけません。あなたはディスプレイと "ビジネスロジック"を混ぜ合わせることはありません – GhostCat

+0

実際に彼はビジネスロジックは必要ないと思っています。状態は既にチェックボックスに入っていますが、間違っているかもしれません。 –

関連する問題