1

チャット パネルを作成して Jframe に追加しましたが、パネルが表示されません。しかし、チャット パネルの私の SOP はコンソールに表示されています。誰でも何が問題なのか教えてください

マイフレーム

public class MyFrame extends JFrame {

MyPanel chatClient;
  String input;

public MyFrame() {

    input = (String)JOptionPane.showInputDialog(null, "Name:", "Connect to chat                  
server", JOptionPane.QUESTION_MESSAGE, null,null, "Test");
input=input.trim();
chatClient = new MyPanel("localhost",input);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
add(chatClient);

 }
  public static void main(String...args){
    new MyFrame();
  }
}

マイパネル:

public class MyPanel extends JPanel{
  ChatClient chatClient;

  public MyPanel(String host, String uid) {
    chatClient= new ChatClient(host,uid);
    add(chatClient.getChatPanel());
    this.setVisible(true);
  }
}

チャットパネル:

public class ChatClient  {

  Client client;
  String name;
  ChatPanel chatPanel;
  String hostid;

  public ChatClient(String host,String uid){
    client = new Client();
    client.start();
    System.out.println("in constructor");
    Network.register(client);

    client.addListener(new Listener(){

      public void connected(Connection connection){
        System.out.println("in client connected method");
        Network.RegisterName registerName = new Network.RegisterName();
        registerName.name=name;
        client.sendTCP(registerName);
      }

      public void received(Connection connection,Object object){
        System.out.println("in client received method");

          if (object instanceof Network.UpdateNames) {
                  Network.UpdateNames updateNames = (Network.UpdateNames)object;
                  //chatFrame.setNames(updateNames.names);

                  System.out.println("got it message");
                  return;
          }

          if (object instanceof Network.ChatMessage) {
                  Network.ChatMessage chatMessage = (Network.ChatMessage)object;
                  //chatFrame.addMessage(chatMessage.text);
                    System.out.println("send it message");
                  return;
          }

      }



    }); // end of listner

    name=uid.trim();
    hostid=host.trim();
    chatPanel = new ChatPanel(hostid,name);

    chatPanel.setSendListener(new Runnable(){

      public void run(){
        Network.ChatMessage chatMessage = new Network.ChatMessage();
        chatMessage.chatMessage=chatPanel.getSendText();
        client.sendTCP(chatMessage);
      }
    });

    new Thread("connect"){
      public void run(){
        try{
          client.connect(5000, hostid,Network.port);
        }catch(IOException e){
          e.printStackTrace();
        }
      }
    }.start();

  }//end of constructor

  static public class ChatPanel extends JPanel{

    CardLayout cardLayout;
    JList messageList,nameList;
    JTextField sendText;
    JButton sendButton;
    JPanel topPanel,bottomPanel,panel;

    public ChatPanel(String host,String user){
      setSize(600, 200);
      this.setVisible(true);
      System.out.println("Chat panel "+host+"user: "+user);
      {
        panel = new JPanel(new BorderLayout());
        {
          topPanel = new JPanel(new GridLayout(1,2));
          panel.add(topPanel); 
          {
            topPanel.add(new JScrollPane(messageList=new JList()));
            messageList.setModel(new DefaultListModel());
          } 
          {
            topPanel.add(new JScrollPane(nameList=new JList()));
            nameList.setModel(new DefaultListModel());
          }
          DefaultListSelectionModel disableSelections = new DefaultListSelectionModel() {
                                                          public void setSelectionInterval (int index0, int index1) {
                                                          }
                                                  };

          messageList.setSelectionModel(disableSelections);
          nameList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        } 
        {
          bottomPanel = new JPanel(new GridBagLayout());
          panel.add(bottomPanel,BorderLayout.SOUTH);

          bottomPanel.add(sendText=new JTextField(),new GridBagConstraints(0,0,1,1,1,0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0));
          bottomPanel.add(sendButton=new JButton(),new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.CENTER,0,new Insets(0,0,0,0),0,0));
        }

      }

      sendText.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
          sendButton.doClick();
        }
      });

    }


    public void setSendListener (final Runnable listener) {
            sendButton.addActionListener(new ActionListener() {
                    public void actionPerformed (ActionEvent evt) {
                            if (getSendText().length() == 0) return;
                            listener.run();
                            sendText.setText("");
                            sendText.requestFocus();
                    }
            });
    }

    public String getSendText () {
            return sendText.getText().trim();
    }

    public void setNames (final String[] names) {
      EventQueue.invokeLater(new Runnable(){
        public void run(){
          DefaultListModel model = (DefaultListModel)nameList.getModel();
          model.removeAllElements();
          for(String name:names)
            model.addElement(name);
        }
      });

    }

    public void addMessage (final String message) {
            EventQueue.invokeLater(new Runnable() {
                    public void run () {
                            DefaultListModel model = (DefaultListModel)messageList.getModel();
                            model.addElement(message);
                            messageList.ensureIndexIsVisible(model.size() - 1);
                    }
            });
    }

  }

  public JPanel getChatPanel(){
    return chatPanel;
  }

}

編集1

public class ChatPanel {
  ChatP caht;
  public ChatPanel1() {
    caht=new ChatP();
  }
  static class ChatP extends JPanel{
    JPanel panel;
    public ChatP(){
      panel = new JPanel();
      panel.add(new JLabel("hi from chat panel"));
    }
  }

  public JPanel getChatPanel(){
    return caht;
  }
}
4

3 に答える 3

4

コールしpack()ます。石畳のコードにはまだ多くの問題と奇妙な側面がありますが、..

ここに画像の説明を入力

import java.awt.*;
import javax.swing.*;

public class MyFrame extends JFrame {

    MyPanel chatClient;
    String input;

    public MyFrame() {
        chatClient = new MyPanel("localhost","input");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(chatClient);

        pack();
        // Do last!
        setVisible(true);
    }
    public static void main(String...args){
        new MyFrame();
    }
}

class MyPanel extends JPanel{

    public MyPanel(String host, String uid) {
        ChatPanel chatPanel = new ChatPanel();
        add(chatPanel.getChatPanel());
    }
}

class ChatPanel {
    ChatP caht;

    public ChatPanel() {
        caht=new ChatP();
    }

    static class ChatP extends JPanel{
        public ChatP(){
            add(new JLabel("hi from chat panel"));
        }
    }

    public JPanel getChatPanel(){
        return caht;
    }
}

ノート

電池は含まれていません。そのソースは、問題を診断して解決策を提案するために必要な最小限のコードでした。より良いヘルプが必要な場合は、SSCCEを投稿してください。

  • フレームまたはパネルを拡張しないでください。単にそれぞれへの参照を保持してください。
  • EDT で GUI を開始および更新します。詳細については、Swingでの同時実行を参照してください。
于 2012-06-29T09:12:12.957 に答える
2

もうすぐです。このビットのコードは逆です。

setVisible(true);
add(chatClient);

そのはず:

add(chatClient);
pack();
setVisible(true);

pack()また、フレームがすべて表示される準備ができていることを確認する呼び出しに注意してください。

于 2012-06-29T09:19:00.420 に答える
2

setVisible(true)(フレーム上) は最後の行にするかrevalidate()、コンポーネントをフレームに追加した後にフレーム コンテンツ ペインで呼び出す必要があります。

于 2012-06-29T09:12:40.563 に答える