日期:2014-05-20  浏览次数:20642 次

关于Swing的问题...求大牛指点迷津....
package com.vampire;

import java.awt.*;

import javax.swing.*;

public class CharClient extends JFrame{
private static final long serialVersionUID = -989848674198876434L;

public CharClient(){
setTitle("CharClient");
Container rq = getContentPane();
setVisible(true);
setBounds(300,100,260,350);
setLayout(new BorderLayout());

JPanel p1 = new JPanel(new BorderLayout());
JTextField wbk = new JTextField();//文本框
p1.add(BorderLayout.CENTER,wbk);
JButton an = new JButton("发送"); //按纽
p1.add(BorderLayout.EAST,an);
rq.add(BorderLayout.SOUTH,p1);

JTextArea wby = new JTextArea("欢迎使用CharClient\n",60,0);//文本域
wby.setLineWrap(true);
JScrollPane p2 = new JScrollPane(wby);
rq.add(BorderLayout.CENTER,p2);
}

public static void main(String[] args){
new CharClient();
}
}
不知道为什么程序运行后只能改变面板大小才能显示内容....求解....


还有本人自学新手....程序有哪些写的不好的地方求指教...

谢谢了!!!!

------解决方案--------------------
把 setVisible()方法放在最后调用就可以解决这个问题了,就是在new CharClient().setVisible(true),已测试可行。
你在一些组件还为初始化的时候就调用setVisible()方法会对后期的一些组件属性的设置造成一些影响
------解决方案--------------------
一般先把界面布置好后,最后用
setVisible(true);
------解决方案--------------------
3L说了
LZ把setVisible(true)放在构造方法的最后就可以了
因为setVisible就会把窗体画到屏幕上,所以后面添加的组件如果不发生重绘(repaint)事件的话,就有可能显示不了,所以LZ一开始看到的组件没有显示,但是修改面板大小会发生重绘事件,所以组建会被重新画出来,所以LZ就能看到组建显示了

------解决方案--------------------
Java code



import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class ChatClientFrame extends JFrame {
  
  private JTextArea textArea;
  private Action send;
  private JTextField inputField;
  public ChatClientFrame(String title) {
    
    super(title);
    
    textArea = new JTextArea();
    textArea.setEditable(false);
    textArea.setLineWrap(true);
    
    send = new AbstractAction("Send") {

      @Override
      public void actionPerformed(ActionEvent e) {
        
        String message = inputField.getText();
        inputField.setText("");
        // ... send message logic
      }
    };
    
    inputField = new JTextField();
    
    layoutComponents();
    pack();
  }
  
  private void layoutComponents() {
    
    textArea.setPreferredSize(new Dimension(500, 500));
    JScrollPane center = new JScrollPane(textArea);
    center.setBorder(BorderFactory.createCompoundBorder(
            center.getBorder(),
            BorderFactory.createEmptyBorder(5, 5, 5, 5)));
    
    FlowLayout layout = new FlowLayout(FlowLayout.LEFT);
    JPanel south = new JPanel(layout);
    
    JButton button = new JButton(send);
    int width = center.getPreferredSize().width - 
                button.getPreferredSize().width -
                (layout.getHgap() * 3);
    
    int height = button.getPreferredSize().height;
    
    inputField.setPreferredSize(new Dimension(width, height));
    
    south.add(inputField);
    south.add(button);
    
    getContentPane().add(center, BorderLayout.CENTER);
    getContentPane().add(south, BorderLayout.SOUTH);
  }
  
  public static void main(String[] args) {
    
    SwingUtilities.invokeLater(new Runnable() {

      @Override
      public void run() {
        
        JFrame f = new ChatClientFrame("Chat Client");
        f.setLocationRelativeTo(null);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setVisible(true);
      }
    });
  }
}