?? welcomejframe.java
字號:
//【例7.3】 設(shè)計滾動字演示線程狀態(tài)及改變方法。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class WelcomeJFrame extends JFrame
{
private JDialog dialog;
private JLabel label_dialog;
public WelcomeJFrame(String[] texts) //texts指定移動字符串
{ //數(shù)組元素個數(shù)決定窗口中的面板數(shù)
super("滾動字");
this.setSize(400,300);
this.setLocation(300,240);
this.setDefaultCloseOperation(EXIT_ON_CLOSE); //單擊窗口關(guān)閉按鈕時,結(jié)束程序運行
if (texts==null || texts.length==0)
this.add(new RollbyJPanel("Welcome!")); //至少有一行字符串
else
{
this.setLayout(new GridLayout(texts.length,1));//網(wǎng)格布局,1行若干列
for (int i=0;i<texts.length;i++)
this.add(new RollbyJPanel(texts[i]));
}
this.setVisible(true);
dialog = new JDialog(this,"提示",true); //模式窗口
dialog.setSize(240,80);
label_dialog = new JLabel("",JLabel.CENTER);
dialog.add(label_dialog);
dialog.setDefaultCloseOperation(HIDE_ON_CLOSE); //單擊對話框的關(guān)閉按鈕時,隱藏對話框而不結(jié)束程序運行
}
public WelcomeJFrame()
{
this(null);
}
private class RollbyJPanel extends JPanel implements ActionListener, Runnable
{ //自定義面板類,私有內(nèi)部類,實現(xiàn)單擊事件監(jiān)聽器接口和線程接口
private JTextField text_word,text_sleep; //滾動字文本行,線程睡眠時間文本行
private JButton button_start,button_interrupt; //啟動按鈕,中斷按鈕
private JTextField text_state; //線程狀態(tài)文本行
private Thread thread_rollby; //線程對象
private int sleeptime; //線程睡眠時間
private RollbyJPanel(String text) //內(nèi)部面板類構(gòu)造方法
{
this.setLayout(new GridLayout(2,1));
for(int i=0;i<100;i++) //為字符串添加空格
text = text + " ";
text_word = new JTextField(text);
this.add(text_word);
JPanel panel_sub = new JPanel(new FlowLayout(FlowLayout.LEFT));
this.add(panel_sub);
panel_sub.add(new JLabel("sleep"));
this.sleeptime = (int)(Math.random()*100);
text_sleep = new JTextField(""+sleeptime,5);
panel_sub.add(text_sleep);
text_sleep.addActionListener(this);
button_start = new JButton("啟動");
panel_sub.add(button_start);
button_start.addActionListener(this);
button_interrupt = new JButton("中斷");
panel_sub.add(button_interrupt);
button_interrupt.addActionListener(this);
thread_rollby = new Thread(this); //創(chuàng)建線程對象,目標(biāo)對象是當(dāng)前對象
button_interrupt.setEnabled(false); //設(shè)置中斷按鈕為無效狀態(tài)
panel_sub.add(new JLabel("state"));
text_state = new JTextField(""+thread_rollby.getState(),10);
text_state.setEditable(false);
panel_sub.add(text_state);
}
public void run() //線程體,必須是公有方法
{
while (thread_rollby.isAlive() && !thread_rollby.isInterrupted())
{ //線程活動且沒中斷時
try
{
String str = text_word.getText();
str = str.substring(1)+ str.substring(0,1);
text_word.setText(str);
thread_rollby.sleep(sleeptime); //線程睡眠,拋出異常
}
catch(InterruptedException e)
{
break; //退出循環(huán)
}
}
} //run()方法結(jié)束,線程對象終止
public void actionPerformed(ActionEvent e) //單擊事件處理,必須是公有方法
{
if(e.getSource()==button_start) //單擊啟動按鈕時
{
thread_rollby = new Thread(this); //重新創(chuàng)建一個線程對象
thread_rollby.start();
text_state.setText(""+thread_rollby.getState()); //顯示線程狀態(tài)
button_start.setEnabled(false);
button_interrupt.setEnabled(true);
}
if(e.getSource()==button_interrupt) //單擊中斷按鈕時
{
thread_rollby.interrupt(); //設(shè)置當(dāng)前線程對象中斷標(biāo)記
text_state.setText(""+thread_rollby.getState());
button_start.setEnabled(true);
button_interrupt.setEnabled(false);
}
if(e.getSource()==text_sleep) //單擊線程睡眠時間文本行時
{
try
{
sleeptime = Integer.parseInt(text_sleep.getText());
}
catch(NumberFormatException nfe)
{
label_dialog.setText("\""+text_sleep.getText()+"\" 不能轉(zhuǎn)換成整數(shù),請重新輸入!");
dialog.setLocation(this.getX()+100,this.getY()+100);
dialog.setVisible(true);
}
}
}
}
public static void main(String arg[])
{
String[] texts={"Welcome","Hello","Rollby"};
new WelcomeJFrame(texts);
}
}
/*
new WelcomeJFrame();
相當(dāng)于
String[] texts={"Welcome"};
new WelcomeJFrame(texts);
*/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -