问题描述:
import java.awt.*
import java.awt.event.*
import javax.swing.*
class NumException extends Exception{
public String toString(){
return "输入的值太小"
}
public String shuru(){
return "请输入数字"
}
}
class jisuanqi extends JFrame implements ActionListener,ItemListener{
JRadioButton rz
JRadioButton rm
ButtonGroup bg
JTextField txt
JButton btnj
String msg
jisuanqi(){
super("计算器")
rz=new JRadioButton("周长")
rm=new JRadioButton("面积")
bg=new ButtonGroup()
txt=new JTextField()
btnj=new JButton("计算")
msg=""
this.getContentPane().setLayout(new GridLayout(2,2))
bg.add(rz)
bg.add(rm)
this.getContentPane().add(rz)
this.getContentPane().add(rm)
this.getContentPane().add(txt)
this.getContentPane().add(btnj)
this.setSize(200,200)
rz.addItemListener(this)
rm.addItemListener(this)
btnj.addActionListener(this)
}
实现接口
public void actionPerformed(ActionEvent e) throws NumException{声明异常
if (Double.parseDouble(txt.getText())<=0){
throw new NumException()抛出异常
}
if (msg.equals("周长")){
txt.setText(""+(3.14*2*Double.parseDouble(txt.getText())))
}
if (msg.equals("面积")){
txt.setText(""+3.14*(Double.parseDouble(txt.getText())*Double.parseDouble(txt.getText())))
}
}
实现接口
public void itemStateChanged(ItemEvent e){
if (e.getSource()==rz){
msg="周长"
}
if (e.getSource()==rm){
msg="面积"
}
}
public static void main(String args[]){
try{
jisuanqi js=new jisuanqi()
js.setVisible(true)
}
catch(NumException ex){
System.out.println(ex)
}
}
}
编译时出现:
C:\Documents and Settings\Administrator\桌面\新建文件夹\jisaunqi.java:45: jisuanqi 中的 actionPerformed(java.awt.event.ActionEvent) 无法实现 java.awt.event.ActionListener 中的 actionPerformed(java.awt.event.ActionEvent);被覆盖的方法不抛出 NumException
解析:
这段代码有问题:
实现接口
public void actionPerformed(ActionEvent e) throws NumException{声明异常
public void actionPerformed(ActionEvent e)不应该抛出异常, ActionListener接口函数没有异常抛出
一种可能的解决方法是把判断移到另外一个函数中,然后抛出异常,在actionPerformed中捕获或者在外面捕获
MyEventTest java:
package wintys event
import javax swing event EventListenerList
import java util Date
import java text DateFormat
import java text SimpleDateFormat
/**
* Java的事件机制/自定义事件
运行结果:
do something interesting in source here
listener detects [event]:wintys event MyEvent[source=wintys event MySource@
] [occur at]: : :
listener detects [event]:wintys event MyEvent[source=wintys event MySource@
] [occur at]: : :
* @version
* @author 天堂露珠 ()
* @see
*/
class MyEventTest{
public static void main(String[] args){
MySource source = new MySource()
MyListener myListener = new MyListener(){
public void doMyAction(MyEvent e){
System out println( listener detects + e)
}
}
source addMyListener(myListener)
source addMyListener(myListener)
source addMyListener(myListener)
source removeMyListener(myListener)
source doSomething()
}
}
/**
* 自定义的事件
* @version
* @author 天堂露珠()
* @see
*/
class MyEvent extends java util EventObject{
private Date date//记录事件发生的时间
public MyEvent(Object source Date date){
super(source)
this date = date
}
public String toString(){
DateFormat df = new SimpleDateFormat( yyyy MM dd HH:mm:ss )
String dt = df format(date)
return [event]: + super toString() + [occur at]: + dt
}
}
/**
* 自定义事件监听器接口
* @version
* @author 天堂露珠()
* @see
*/
interface MyListener extends java util EventListener{
void doMyAction(MyEvent e)
}
/**
* 自定义事件源
* @version
* @author 天堂露珠()
* @see
*/
class MySource{
/**
* 保存注册的监听器列表
* 子类可以使用它保存自己的事件监听器(非MyListener监听器)列表
*/
protected EventListenerList listenerList = new EventListenerList()
private MyEvent myEvent = null//fireDoMyAction()使用此变量
/**
* 没有做任何事
*/
public MySource(){
}
/**
* 添加一个MyListener监听器
*/
public void addMyListener(MyListener listener){
listenerList add(MyListener class listener)
}
/**
* 移除一个已注册的MyListener监听器
* 如果监听器列表中已有相同的监听器listener listener
* 并且listener ==listener
* 那么只移除最近注册的一个监听器
*/
public void removeMyListener(MyListener listener){
listenerList remove(MyListener class listener)
}
/**
* @return 在此对象上监听的所有MyListener类型的监听器
*/
public MyListener[] getMyListeners(){
return (MyListener[])listenerList getListeners(MyListener class)
}
//Winty:Copy directly from javax swing event EventListenerList
/*Notify all listeners that have registered interest for
notification on this event type The event instance
is lazily created using the parameters passed into
the fire method
*/
protected void fireDoMyAction() {
// getListenerList() Guaranteed to return a non null array
Object[] listeners = listenerList getListenerList()
// Process the listeners last to first notifying
// those that are interested in this event
for (int i = listeners length i>= i = ) {
if (listeners[i]==MyListener class) {
// Lazily create the event:
if (myEvent == null)
myEvent = new MyEvent(this new Date())
((MyListener)listeners[i+ ]) doMyAction(myEvent)
}
}
}
/**
* 做一些事件源应该做的有意义的事 然后通知监听器
* 这里只是一个示例方法
* 例如:MySource如果是一个按钮 则doSomething()就可以命名为click()
* 当用户点击按钮时调用click()方法
*/
public void doSomething() {
System out println( do something interesting here )
fireDoMyAction()//通知监听器
}
}
lishixinzhi/Article/program/Java/hx/201311/26237