求大虾,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实现比较好,给你贴出来实现的实例
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(); } }}