关于JRadioButton中fireActionPerformed里面的执行顺序的问题

vimmiv3 2010-03-02 07:38:55
最近在学习core java这本书
读到捕获异常这里时 对如下这段代码的执行顺序不太理解
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class ExceptTest_1
{
public static void main(String[] args)
{
ExceptTestFrame frame = new ExceptTestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

/**
A frame with a panel for testing various exceptions
*/
class ExceptTestFrame extends JFrame
{
public ExceptTestFrame()
{
setTitle("ExceptTest");
ExceptTestPanel panel = new ExceptTestPanel();
add(panel);
pack();
}
}

/**
A panel with radio buttons for running code snippets
and studying their exception behavior
*/
class ExceptTestPanel extends Box
{
public ExceptTestPanel()
{
super(BoxLayout.Y_AXIS);
group = new ButtonGroup();

// add radio buttons for code snippets

addRadioButton("Integer divide by zero", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
a[1] = 1 / (a.length - a.length);
}
});

addRadioButton("Floating point divide by zero", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
a[1] = a[2] / (a[3] - a[3]);
}
});

addRadioButton("Array bounds", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
a[1] = a[10];
}
});

addRadioButton("Bad cast", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
a = (double[])event.getSource();
}
});

addRadioButton("Null pointer", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
event = null;
System.out.println(event.getSource());
}
});

addRadioButton("sqrt(-1)", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
a[1] = Math.sqrt(-1);
}
});

addRadioButton("Overflow", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
a[1] = 1000 * 1000 * 1000 * 1000;
int n = (int) a[1];
}
});

addRadioButton("No such file", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
try
{
InputStream in = new FileInputStream("woozle.txt");
}
catch (IOException e)
{
textField.setText(e.toString());
}
}
});

addRadioButton("Throw unknown", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
throw new UnknownError();
}
});

// add the text field for exception display
textField = new JTextField(30);
add(textField);
}

/**
Adds a radio button with a given listener to the
panel. Traps any exceptions in the actionPerformed
method of the listener.
@param s the label of the radio button
@param listener the action listener for the radio button
*/
private void addRadioButton(String s, ActionListener listener)
{
JRadioButton button = new JRadioButton(s, false)
{
// the button calls this method to fire an
// action event. We override it to trap exceptions
protected void fireActionPerformed(ActionEvent event)
{
try
{
textField.setText("No exception");
super.fireActionPerformed(event);
}
catch (Exception e)
{
textField.setText(e.toString());
}
}
};

button.addActionListener(listener);
add(button);
group.add(button);
}

private ButtonGroup group;
private JTextField textField;
private double[] a = new double[10];
}



经过测试发现 textField.setText("No exception");这条语句的执行顺序似乎有问题
按照程序流程 应该是每次选中JRadioButton时 先执行textField.setText("No exception");
但实际执行的时候发现是 super.fireActionPerformed(event);先执行的
通过加入Thread.sleep尝试了好几次 确定了这个执行顺序
哪位高手能解释一下
...全文
160 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vimmiv3 2010-03-03
  • 打赏
  • 举报
回复
非常感谢你的回复
昨晚上网搜索了一下
发现swing里线程的执行方式似乎很糟糕
自己还得加强学习
truediego 2010-03-02
  • 打赏
  • 举报
回复
还有很多
基本上操作控件的都可以认为是依赖画面

例如setVisible, setEnabled等等
vimmiv3 2010-03-02
  • 打赏
  • 举报
回复
谢谢你的回答 我还想问一句
那除了setText外 还有哪些类似的方法是依赖于画面更新的呢
truediego 2010-03-02
  • 打赏
  • 举报
回复
textField.setText("No exception");
这句除了text赋值之外,还要更新画面,但是更新画面是事件驱动,等待当前画面处理完成之后才运行(在你的例子中就是JRadioButton.fireActionPerformed执行完,setText的更新画面才执行)

super.fireActionPerformed(event);
这句单纯是函数调用,属于JRadioButton.fireActionPerformed的一部分

也就是上面的setText要等super.fireActionPerformed(event); 执行完才会执行

62,624

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧