代码如下:
package frames;import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Label;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;import javax.swing.JFrame;
import javax.swing.JPanel;public class GameFrame extends JFrame { /**
 * 
 */
private static final long serialVersionUID = 1L; static final Random random = new Random(); static final StringBuffer sb = new StringBuffer(""); static private int charCounter = 1; static JFrame frame = new JFrame();

static JPanel panel = new JPanel(); static String letters; static Label[] labels = new Label[11]; static Timer timer = new Timer(); public GameFrame() { frame.setBounds(200, 200, 600, 200);

frame.setLayout(new FlowLayout());

panel.setBackground(Color.YELLOW);

panel.setSize(200, 100);

timer.schedule(new TimerTask() { @Override
public void run() { panel.removeAll();

letters = makeLetter();

for (int i = 0; i < letters.length(); i++) {

labels[i] = new Label(letters.charAt(i) + "");

System.out.println(labels[i].getText()); panel.add(labels[i]);

}
}
}, 0, 3000); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(3);

frame.setVisible(true); } public static String makeLetter() { sb.delete(0, sb.length()); for (int i = 0; i < charCounter; i++) { int ranNum = random.nextInt(26); char character = (char) (ranNum + 'A'); sb.append(character);
} charCounter++; return sb.toString(); }}

解决方案 »

  1.   

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Label;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;import javax.swing.JFrame;
    import javax.swing.JPanel;public class GameFrame extends JFrame {
    private static final long serialVersionUID = 1L;
    static final Random random = new Random();
    static final StringBuffer sb = new StringBuffer("");
    static private int charCounter = 1;
    static JFrame frame = new JFrame();
    static JPanel panel = new JPanel();
    static String letters;
    static Label[] labels = new Label[11];
    static Timer timer = new Timer(); public GameFrame() {
    frame.setBounds(200, 200, 600, 200);
    frame.setLayout(new BorderLayout());

    panel.setBackground(Color.YELLOW);
    panel.setLayout(new FlowLayout());

    timer.schedule(new TimerTask() {
    @Override
    public void run() {
    panel.removeAll();
    letters = makeLetter(); for (int i = 0; i < letters.length(); i++) {
    labels[i] = new Label(letters.charAt(i) + "");
    System.out.println(labels[i].getText());
    panel.add(labels[i]);
    }

    panel.invalidate(); // 使而已重新生效
    panel.validate();
    }
    }, 0, 1000); frame.getContentPane().add(panel);
    frame.setDefaultCloseOperation(3);
    frame.setVisible(true);
    } public static String makeLetter() {
    sb.delete(0, sb.length());
    for (int i = 0; i < charCounter; i++) {
    int ranNum = random.nextInt(26);
    char character = (char) (ranNum + 'A');
    sb.append(character);
    }
    charCounter++;
    return sb.toString();
    }

    public static void main(String[] args) {
    new GameFrame();
    }
    }
      

  2.   

    可能是窗口太小,或者是layout的问题
      

  3.   

    2楼的用得方法也能刷新,但是刷新后内容是以列的形式出现的,后来我查看api发现可以用panel.updateUI();(重绘)来解决,代码如下:package frames;import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Label;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;import javax.swing.JFrame;
    import javax.swing.JPanel;public class GameFrame extends JFrame { /**
     * 
     */
    private static final long serialVersionUID = 1L; static final Random random = new Random(); static final StringBuffer sb = new StringBuffer(""); static private int charCounter = 1; static JFrame frame = new JFrame();

    static JPanel panel = new JPanel(); static String letters; static Label[] labels = new Label[11]; static Timer timer = new Timer(); public GameFrame() { frame.setBounds(200, 200, 600, 200);

    frame.setLayout(new FlowLayout());

    panel.setBackground(Color.YELLOW);

    panel.setSize(600, 100);

    timer.schedule(new TimerTask() { @Override
    public void run() {

    panel.removeAll();

    letters = makeLetter();

    for (int i = 0; i < letters.length(); i++) {

    labels[i] = new Label(letters.charAt(i) + ""); panel.add(labels[i]); panel.updateUI();//重绘
    // panel.invalidate();//2楼的方法,也能实现,但是效果不同,可能是因为布局原因
    //
    // panel.validate();
    }
    }
    }, 0, 3000); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(3);

    frame.setVisible(true); } public static String makeLetter() { sb.delete(0, sb.length()); for (int i = 0; i < charCounter; i++) { int ranNum = random.nextInt(26); char character = (char) (ranNum + 'A'); sb.append(character);
    } charCounter++; return sb.toString(); }}
      

  4.   

    加doLayout()
    panel.doLayout();package frames;import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.Label;
    import java.util.Random;
    import java.util.Timer;
    import java.util.TimerTask;import javax.swing.JFrame;
    import javax.swing.JPanel;public class GameFrame extends JFrame { /**
    *  
    */
    private static final long serialVersionUID = 1L; static final Random random = new Random(); static final StringBuffer sb = new StringBuffer(""); static private int charCounter = 1; static JFrame frame = new JFrame(); static JPanel panel = new JPanel(); static String letters; static Label[] labels = new Label[11]; static Timer timer = new Timer(); public GameFrame() { frame.setBounds(200, 200, 600, 200); frame.setLayout(new FlowLayout()); panel.setBackground(Color.YELLOW); panel.setSize(200, 100); timer.schedule(new TimerTask() { @Override
    public void run() { panel.removeAll();
    letters = makeLetter(); for (int i = 0; i < letters.length(); i++) { labels[i] = new Label(letters.charAt(i) + ""); System.out.println(labels[i].getText()); panel.add(labels[i]); }
    // 加doLayout()
    panel.doLayout();
    }
    }, 0, 3000); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(3); frame.setVisible(true); } public static String makeLetter() { sb.delete(0, sb.length()); for (int i = 0; i < charCounter; i++) { int ranNum = random.nextInt(26); char character = (char) (ranNum + 'A'); sb.append(character);
    } charCounter++; return sb.toString(); }}
      

  5.   

    前两天也碰到了这个问题,查了好多,最后还是自己试出来的。
    添加完控件之后,再加上
    setVisible(false);
    setVisible(true);
    这两句,强制刷新一下就好了
      

  6.   

    labels[i] = new Label(letters.charAt(i) + "");
    System.out.println(labels[i].getText());
    panel.add(labels[i]);
    panel.updateUI();
    每次添加后需刷新