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

求大虾,JFrame,JTextArea,打字效果,搞了一下午啦
我要实现的效果:JFrame上有两个组件:JButton,JTextArea,当按JButton后---JTextArea中会一个一个自动写入字。
出现的问题:如果不通过JButton,自己在main()中实例化,并调用write(),效果可实现;但是如果通过JButton的ActionListener(),则效果不能出现
代码如下:



import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Test12 extends JFrame {

  JTextArea jb = null;
  JScrollPane js = null;
  JButton jb2 = null;
public static void main(String[] args) {

// new Test12().write();
}

public Test12() {
this.setSize(500, 500);
this.setVisible(true);
this.setResizable(true);
this.setLayout(null);
jb = new JTextArea();
jb.setLineWrap(true);
js = new JScrollPane(jb);
js.setBounds(10, 10, 100, 100);
jb2 = new JButton("OK");
jb2.setBounds(100, 100, 100, 100);
jb2.addActionListener(new ActionListener(){
  @Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
write();
}
});
this.add(jb2);
this.add(js);
this.repaint();
}


public void write() {

String c = "你好啊,放飞梦想共勉:让我们以一种平常";
int a = 0;
int x = 0;
int y = 1;


for(int i=0;i<c.length();i++){
for (int j1=0; j1<300000000; j1++) {
a = a + 1;
}
if(i==0){
jb.setText(c.substring(i, i+1));
}else{
jb.append(c.substring(i, i+1));

}

x++;
y++;
}
}
}


------解决方案--------------------
对于你这个想要的按钮效果,采用javax.swing.Timer实现比较好,给你贴出来实现的实例
Java code

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

/**
 * 这个又是典型的SWING线程模型的问题
 * 我不知道如何通过SwingUilities.invokerLater来解决
 * 这个就说明自己对此模型理解的还是不到位
 */
public class Test12 extends JFrame {

    final JTextArea jb;
    JScrollPane js = null;
    JButton jb2 = null;
    public static void main(String[] args) {

        new Test12();
    }

    public Test12() {
        this.setSize(500, 500);
        this.setVisible(true);
        this.setResizable(true);
        this.setLayout(null);
        jb = new JTextArea();
        jb.setLineWrap(true);
        js = new JScrollPane(jb);
        js.setBounds(10, 10, 100, 100);
        jb2 = new JButton("OK");
        jb2.setBounds(100, 100, 100, 100);
        jb2.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
                SwingUtilities.invokeLater(new Runnable(){
                    public void run(){
                        write();
                    }
                });

            }
        });
        this.add(jb2);
        this.add(js);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    public void write() {

        String c = "你好啊,放飞梦想共勉:让我们以一种平常";
        int a = 0;
        int x = 0;
        int y = 1;


        for(int i=0;i<c.length();i++){
//            for (int j1=0; j1<300000000; j1++) {
//                a = a + 1;
//            }      这里用线程休眠就可以了,还节约CPU资源
            try{
                Thread.sleep(500*1);
            }catch(Exception e){
                e.printStackTrace();
            }
            if(i==0){
                final String t=c.substring(i, i+1);
//                jb.setText(t);
                SwingUtilities.invokeLater(new Runnable(){
                    public void run(){
                        try{
                            Thread.sleep(100*1);
                        }catch(Exception e){
                            e.printStackTrace();
                        }
                        jb.setText(t);
                    }
                });

            }else{
                final String s=c.substring(i, i+1);
//                jb.append(s);
//
                SwingUtilities.invokeLater(new Runnable(){
                    public void run(){
                        try{
                            Thread.sleep(100*1);
                        }catch(Exception e){
                            e.printStackTrace();
                        }
                        jb.append(s);
                    }
                });


            }



            x++;
            y++;
            this.repaint();
        }

    }
}