package Thread;
import java.awt.Dimension;
import java.awt.GridLayout;
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;
public class WelcomeJFrame extends JFrame {
public WelcomeJFrame(String texts[]) {
super("滚动字");
Dimension dim = getToolkit().getScreenSize(); // 获得系统屏幕宽、高
setBounds(dim.width / 4, dim.height / 4, dim.width / 2 + 50,
dim.height / 2);
setDefaultCloseOperation(EXIT_ON_CLOSE);
if (texts == null || texts.length == 0) { // 保证有一栏
this.getContentPane().add(new RollbyJPanel("Welcome"));
} else {
this.getContentPane().setLayout(new GridLayout(texts.length, 1));
for (int i = 0; i < texts.length; i++) {
this.getContentPane().add(new RollbyJPanel(texts[i])); // 每一个字符串都new一块面板
}
}
setVisible(true);
}
public WelcomeJFrame() {
this(null); // 空的构造函数
}
private class RollbyJPanel extends JPanel implements ActionListener,
Runnable {
private JTextField text_word, text_sleep, text_state;
private JButton button_start, button_intterupt;
int sleeptime;
Thread thread;
RollbyJPanel(String text) {
this.setLayout(new GridLayout(2, 1)); // 设置一个面板的的布局为网格布局两行一列
text_word = new JTextField(String.format("%225s", text)); // 将字符串显示在文本条中
this.add(text_word);
JPanel panel_sub = new JPanel();
this.add(panel_sub);
panel_sub.add(new JLabel("sleep"));
this.sleeptime = (int) (Math.random() * 100); // 生成一个0到1的随机数
text_sleep = new JTextField("" + this.sleeptime, 5); // 将随机生成的数加入到sleep文本框中,并且设置文本条长度为5px
panel_sub.add(text_sleep);
text_sleep.addActionListener(this);
button_start = new JButton("启动");
panel_sub.add(button_start);
button_start.addActionListener(this);
button_intterupt = new JButton("中断");
panel_sub.add(button_intterupt);
button_intterupt.addActionListener(this);
panel_sub.add(new JLabel("state"));
text_state = new JTextField("NEW", 10);
panel_sub.add(text_state);
text_state.addActionListener(this);
text_state.setEditable(false);
thread = new Thread(this); // 创建线程对象,目标对象是当前的对象
button_intterupt.setEnabled(false); // 设置中断按钮为无效状态
}
boolean isF = true; //中断标记
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button_start) {
// isF= true; //中断标记
boolean boo = updateSleeptime();
if (!boo) {
return;
}
thread = new Thread(this);
thread.start();
text_state.setText("" + thread.getState()); //在状态文本框设置线程转态
button_start.setEnabled(false);
button_intterupt.setEnabled(true);
}
if (e.getSource() == button_intterupt) {
thread.interrupt(); //中断线程
// thread.interrupted() //当调用这个函数时要在run方法等几个地方设置标记
// isF=false; //中断标记
text_state.setText("" + thread.getState());
button_intterupt.setEnabled(false);
button_start.setEnabled(true);
}
if (e.getSource() == text_sleep) {
updateSleeptime();
}
}
//当在睡眠文本框时,手动输入数字大小时 ,调用的函数
public boolean updateSleeptime() {
String str = text_sleep.getText();
try {
sleeptime = Integer.parseInt(str);
return true;
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(this, str
+ "格式错误,不能转换成整数,请重新输入!!");
return false;
}
}
@Override
public void run() {
while (true) {
String str = text_word.getText();
text_word.setText(str.substring(1) + str.substring(0, 1)); // substring(beginIndex,
// endIndex)左包含,右
// 不包含
try {
Thread.sleep(sleeptime);
} catch (InterruptedException e) {
break;
}
if (!isF) { //中断标记
return;
}
}
}
}
public static void main(String[] args) {
String texts[] = { "Welcome", "Hello", "Rollby" };
new WelcomeJFrame(texts);
}
}