6 如何在Java程序中实现多线程?试简述使用Thread子类和实现Runnable接口两种方法的异同。
解:在Java程序中实现多线程最关键是要定义子线程的操作,即定义子线程的run()方法。具体可以通过派生Thread类的子类或实现Runnable接口两种方式来实现。
派生Thread子类时通过重载父类的方法run()来定义于线程的具体操作,然后在主线程中创建并启动该子类的对象为子线程。
实现了Runnable接口的类必须要实现接口中的run()方法,其中同样定义了子线程的操作。但是这个方法中的子线程不是Thread子类的对象,而是Thread类的对象,在创建Thread类对象时把实现了Runnable接口和run()方法的类作为参数传递给该对象,从而规定它的具体操作。
7 利用多线程技术编写Applet程序,其中包含一个滚动的字符串。字符串从左向右运动,当所有的字符都从屏幕的右边消失后,字符串重新从左边出现并继续向右移动。
解:源程序 ch8_e8_11.java
import java.awt.*;
import java.applet.*;
public class ch8_e8_11 extends Applet implements Runnable
{
final String rollingMessage=\,SAILING,I AM SAILING...\;
Thread m_Draw=null;
int beginX;
public void init()
{
m_Draw=new Thread(this);
}
public void paint(Graphics g)
{
g.drawString(rollingMessage,beginX,40);
}
public void start()
{
m_Draw.start();
try{
Thread.sleep(50);
}catch(InterruptedExceptione){}
}
public void run()
{
try
{
while(true)
{
beginX=++beginX % getWidth();
repaint();
Thread.sleep(100);
}
}
catch(InterruptedException e)
{
}
}
第11章 GUI习题及思考解答
1 JApplet与Applet有何异同?JApplet使用什么缺省布局策略?如何在 JApplet中加入SwingGUI组件?
解:Japplet的缺省布局策略是BorderLayout,Apptet的缺省布局策略是 FlowLayout;在Applet中加入组件可以直接使用Applet自身的add()方法,而在 JApplet中加入组件必须先用getContentPane()获得当前JApplet的容器,然后再调用该容器对象的add()方法。
2 编写一个JApplet程序,包含一个JLabel对象,并显示你的姓名.
解:源程序
import javax.swing.*;
import java.awt.*;
public class ch8_e8_14 extends JApplet
{
JLabel myLbl=new JLabel(\;
public void init()
{
Container c=getContentPane();
c.add(\,myLbl);
} }
3 JButton与Button有何不同?编写一个图形界面的Application程序,包含一个带图标的JButton对象。当用户单击这个按钮时,Application程序把其Erame的标题修改为“单击按钮”。
解:相对于Button,JButton增加了很多实用功能。例如在按钮上增加图标,在鼠标经过或按下时显示不同的效果,显示按钮功能提示等。
源程序
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ch8_e8_15
{
public static void main(String args[])
{
new MyFrame();
}
}
class MyFrame extends Frame implements ActionListener
{
JButton myButton=new JButton(\;
MyFrame()
{
super(\我的窗口\;
add(\,myButton);
myButton.addActionListener(this);
addWindowListener(new closeWin());
setSize(300,200);
setVisible(true);
}
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource()==myButton)
{
setTitle(\单击按钮!\;
}
}
}
class closeWin extends WindowAdapter
{
public void windowClosing(WindowEvent we)
{
we.getwindow().dispose();
System.exit(0);