Class A extend JFrame{
   private M m;
   private N n;
   private P p;
   public A(M m,N n,P p){     //M,N,P分别是三种数据类型
   this.m = m;
   this.n = n;
   this.p = p
}//
   ......后面是自动生成的JFrame组件的一些代码
}我如此使用:
    A a = new A(m,n,p)  //传了三个相对应类型的参数进去
    a.setVisible(true);
结果显示出来的Frame只有主框架,不显示其它组件(例如Button,Lable之类),最小化再点击显示出来就显示黑色的了,调试时把构造函数的 this.m = m 注销掉后,重新运行,显示正常,一加上this.m = m 又马上出问题了,请高手指点下问题所在,困扰了很久了。。

解决方案 »

  1.   


    public class Chat extends javax.swing.JFrame  {
        private DefaultListModel jModel;
        private JxtaSocket m_socket = null;
        private String chater = null;    /** Creates new form Chat */
        public Chat(JxtaSocket socket,String name, Point point) {
            initComponents();
            m_socket = socket;
            chater = name;
            jClew.setText("和" + chater + "聊天中");
            this.setTitle(chater);
            jModel = new DefaultListModel();
            jlHistory.setModel(jModel);
            setLocation((point.x + 300),(point.y + 200));    }    /** This method is called from within the constructor to
         * initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is
         * always regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {        jpaneList = new javax.swing.JScrollPane();
            jlHistory = new javax.swing.JList();
            jpaneText = new javax.swing.JScrollPane();
            jMessage = new javax.swing.JTextArea();
            jbSend = new javax.swing.JButton();
            jClew = new javax.swing.JLabel();        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);        jlHistory.setModel(new javax.swing.AbstractListModel() {
                String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };
                public int getSize() { return strings.length; }
                public Object getElementAt(int i) { return strings[i]; }
            });
            jpaneList.setViewportView(jlHistory);        jMessage.setColumns(20);
            jMessage.setRows(5);
            jpaneText.setViewportView(jMessage);        jbSend.setText("发送");
            jbSend.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    jbSendActionPerformed(evt);
                }
            });        jClew.setText("jLabel1");        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jClew, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                        .addComponent(jpaneList, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                        .addComponent(jpaneText, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                        .addComponent(jbSend, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap())
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jClew, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jpaneList, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jpaneText, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jbSend)
                    .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            );        pack();
        }// </editor-fold>                            private void jbSendActionPerformed(java.awt.event.ActionEvent evt) {                                       
            try
            {
                OutputStream out = m_socket.getOutputStream();
                String s = jMessage.getText();
                jMessage.setText("");
                out.write(s.getBytes(), 0, s.length());
                out.flush();
                out.close();
                jModel.addElement("我: " + s);
            }
            catch(IOException e)
            {        }
            finally
            {
                jMessage.removeAll();
            }
        }                                          /**
        * @param args the command line arguments
        */
        public void listen()
        {
            InputStream in;
            int length = 256*256;
            int realLen;
            byte[] buffer = new byte[length];
            try
            {
                m_socket.setSoTimeout(60*60*1000);
                in = m_socket.getInputStream();
                while(true)
                {
                    realLen = in.read(buffer,0,length);
                    String message = new String(buffer,0,realLen);               
                    jModel.addElement(chater +": " + message);
                    
                }
            }
            catch(IOException e)
            {
                System.out.println("test!");        }
        }  
        // Variables declaration - do not modify                     
        private javax.swing.JLabel jClew;
        private javax.swing.JTextArea jMessage;
        private javax.swing.JButton jbSend;
        private javax.swing.JList jlHistory;
        private javax.swing.JScrollPane jpaneList;
        private javax.swing.JScrollPane jpaneText;
        // End of variables declaration                   }这是源码,其中很大一部分都是netbeans生成的布局代码,另外,listen是自己添加的函数。
    m_socket = socket; 这一句注销掉就可正常显示了,但这句运行是没错的,想单步调试试下,但当了调试不了,提示已编译但没调试信息,烦恼中。。
      

  2.   

    重新调试下,发现注销掉listen函数就正常了,listen函数好像没什么问题呀?
      

  3.   

    好像是跟listen里面的阻塞函数read有关,改成:
     chat.setVisible(true);
            new Thread(){
                public void run(){
                    chat.listen();
                }
            };这样,就可正常显示组件了,但收到的数据又显示不出来了,郁闷呀,继续调试。。