1. 程式人生 > >執行緒基礎,滾動字,“尼瑪炸了!!!”有BUG請大嬸指出

執行緒基礎,滾動字,“尼瑪炸了!!!”有BUG請大嬸指出


import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

import sun.org.mozilla.javascript.internal.regexp.SubString;

public class WelcomeJFrame extends JFrame {
	private class RollbyJPanel extends JPanel implements ActionListener,
			Runnable {
		JTextField tw, tSleep, ts;
		int sleeptime; // 睡眠時間
		JButton btnS, btnI; // 啟動按鈕和中止按鈕
		Thread t; // 執行緒

		RollbyJPanel(String str) {
			this.setLayout(new GridLayout(2, 1));
			char[] space = new char[60];
			tw = new JTextField(str + new String(space)); // 若是“Welcome”,則這個結果為“welcome
															// ”;
			this.add(tw);
			JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
			this.add(p);
			p.add(new JLabel("sleep"));
			this.sleeptime = (int) (Math.random() * 100); // 用隨機數初始化睡眠時間
			tSleep = new JTextField("" + sleeptime, 5);
			p.add(tSleep);
			tSleep.addActionListener(this); // 監聽
			t = new Thread(this);
			btnS = new JButton("開始");
			btnI = new JButton("中止");
			btnS.addActionListener(this);
			btnI.addActionListener(this);
			p.add(btnS);
			p.add(btnI);
		}

		@Override
		public void actionPerformed(ActionEvent e) { // 相應事件
			if (e.getSource() == tSleep) {
				setSleeptime(); // 設定睡眠時間
			}
			if (e.getSource() == btnS) { // 啟動執行緒
				t = new Thread(this);
				setSleeptime();
				t.start();
				btnS.setEnabled(false); // 摁下後使開始按鈕變成不可操作
				btnI.setEnabled(true); // 摁下後使中止按鈕變成可操作
			}
			if (e.getSource() == btnI) {
				t.interrupt(); // 中止執行緒
				btnS.setEnabled(true); // 摁下後使開始按鈕變成可操作
				btnI.setEnabled(false); // 摁下後使中止按鈕變成不可操作
			}
		}

		private void setSleeptime() {
			try { // 一定要捕獲異常
				sleeptime = Integer.parseInt(tSleep.getText()); // 從tSleep中獲得睡眠時間
			} catch (NumberFormatException e1) {
				JOptionPane.showMessageDialog(this, "你媽炸了!!!"); // 彈出對話方塊
			}
		}

		public void run() {  //實現滾動字
			while (true) {
				String str = tw.getText();
				str = str.substring(1) + str.substring(0, 1); 
				tw.setText(str);
				try {
					Thread.sleep(sleeptime);
				} catch (InterruptedException e) {
					break;
				}
			}
		}

	}

	public WelcomeJFrame(String[] str) {
		super("滾動字");
		this.setBounds(500, 100, 400, 400);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		if (str == null || str.length == 0) { // 防止輸入為空
			this.getContentPane().add(new RollbyJPanel("Welcome")); // 為空,則初始顯示“Welcome”
		} else {
			for (int i = 0; i < str.length; i++) {
				this.getContentPane().setLayout(new GridLayout(str.length, 2));
				this.getContentPane().add(new RollbyJPanel(str[i]));
			}
		}
		this.setVisible(true);
	}

	public static void main(String[] args) {
		String[] str = { "你媽炸了!!!", "你媽炸了??", "你媽真炸了", "你媽炸了哦" }; // 需要滾動的字
		new WelcomeJFrame(str); // new 物件
	}

}