javaswing单机事件传值_JavaSwing中三种事件处理⽅法之⽐
javaswing实现购买较(转)
Swing是⽬前Java中不可缺少的窗⼝⼯具组,是⽤户建⽴图形化⽤户界⾯(GUI)程序的强⼤⼯具。Java Swing组件⾃动产⽣各种事件来响应⽤户⾏为。如当⽤户点击按钮或选择菜单项⽬时,Swing组件会产⽣⼀个ActionEvent。Swing组件会产⽣许多事件,如
ActionEvents,ChangeEvents,ItemEvents等,来响应⽤户的⿏标点击⾏为,列表框中值的改变,计时器的开始计时等⾏为。在Java Swing编程中,通过注册,我们可以监听事件源产⽣的事件,从⽽在事件处理程序中处理我们所需要处理的⽤户⾏为。
Java Swing中处理各组件事件的⼀般步骤是:
1. 新建⼀个组件(如JButton)。
2. 将该组件添加到相应的⾯板(如JPanel)。
3. 注册以监听事件源产⽣的事件(如通过ActionListener来响应⽤户点击按钮)。
4. 定义处理事件的⽅法(如在ActionListener中的actionPerformed中定义相应⽅法)。
以上步骤我们可以⽤多种⽅法实现。但⼈们通常⽤⼆种⽅法。第⼀种⽅法是只利⽤⼀个以及多个if语句来决定是哪个组件产⽣的事件;第⼆种⽅法是使⽤多个内部类来响应不同组件产⽣的各种事件,其具体实现⼜分两种⽅式,⼀种是匿名内部类,⼀种是⼀般内部类。
为了说明如何使⽤上述三种⽅法实现事件的处理⽅法,我们建⽴⼀个简单的应⽤程序。该程序界⾯有两个按钮(见图1),当⽤户点击相应的按钮,就会弹出⼀个对话框显⽰相应的内容(见图2)。通过这个简单程序,你可以实现⾃⼰更多、更复杂的⽤户界⾯程序。
图1
图2
⾸先,我们利⽤单个来实现该程序。我们定义⼀个名为Simple1的类来包括所有代码。所有的⽤户⾏为(如点击按钮)由⼀个SimpleListenner中的actionPerformed⽅法来处理。以下是代码:
/*
* Simple1.java - 处理事件的第⼀种⽅法
* 在这个例⼦中,利⽤⼀个ActionListener来监听事件源产⽣的事件
* ⽤⼀些if语句来决定是哪个事件源
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Simple1
{
private static JFrame frame; // 定义为静态变量以便main使⽤
private static JPanel myPanel; // 该⾯板⽤来放置按钮组件
private JButton button1; // 这⾥定义按钮组件
private JButton button2; // 以便让ActionListener使⽤
public Simple1() // 构造器, 建⽴图形界⾯
// 新建⾯板
myPanel = new JPanel();
// 新建按钮
button1 = new JButton("按钮1"); // 新建按钮1
button2 = new JButton("按钮2");
SimpleListener ourListener = new SimpleListener();
// 建⽴⼀个actionlistener让两个按钮共享
button1.addActionListener(ourListener);
button2.addActionListener(ourListener);
myPanel.add(button1); // 添加按钮到⾯板
myPanel.add(button2);
}
private class SimpleListener implements ActionListener {
/*
* 利⽤该内部类来监听所有事件源产⽣的事件
* 便于处理事件代码模块化
*/
public void actionPerformed(ActionEvent e)
{
/
/ 利⽤getActionCommand获得按钮名称
// 也可以利⽤getSource()来实现
// if (e.getSource() ==button1)
String buttonName = e.getActionCommand();
if (buttonName.equals("按钮1"))
JOptionPane.showMessageDialog(frame,
"按钮1 被点击");
else if (buttonName.equals("按钮2"))
JOptionPane.showMessageDialog(frame,
"按钮2 被点击");
else
JOptionPane.showMessageDialog(frame,
"Unknown event" );
}
public static void main(String s[])
{
Simple1 gui = new Simple1(); // 新建Simple1组件
frame = new JFrame("Simple1"); // 新建JFrame
// 处理关闭事件的通常⽅法
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{it(0);} });
frame.pack();
frame.setVisible(true);
}
}
让我们来看看以上代码是如何⼯作的。在main⽅法中,我们定义了⼀个JFrame,然后将⾯板Jpanel添加到窗体中,该⾯板包括两个按钮。相应的变量Frame,button1,button2定义在程序的开头部分。
在程序⼊⼝main⽅法中,⾸先新建Simple1组件,通过构造器建⽴⽤户GUI,定义⼀个⾯板Jpanle,,增加两个按钮,然后利⽤
JButton.addActionListerner将两个按钮加⼊到⼀个活动SimpleLister中,最后,两个按钮添加到⾯板。当GUI建⽴后,我们将⾯板添加到窗体并显⽰结果。当⽤户点击按钮时,程序调⽤actionPerformed⽅法,通过if语句来判断是哪⼀个按钮被点击,然后在对话框中显⽰相应的内容。
利⽤⼀个来处理事件的缺点是,当程序⽐较复杂时,需要⼀⼤串的if 语句来实现,程序代码较难阅读与维护。当然,如果处理的事件较少,这种⽅式⽐较简单。
通过使⽤匿名内部类可以解决上述存在的问题。使⽤简单的匿名内部类作为addActionListener的变量即可。以下是实现代码:
/*
* Simple2.java - 处理事件的第⼆种⽅法
* 在这个例⼦中,利⽤匿名内部类来监听每⼀个事件源产⽣的事件
* 避免使⽤⼀些if语句来决定是哪个事件源
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Simple2
{
private static JFrame frame; // 定义为静态变量以便main使⽤
private static JPanel myPanel; // 该⾯板⽤来放置按钮组件
private JButton button1; // 这⾥定义按钮组件
private JButton button2; // 以便让ActionListener使⽤public Simple2() // 构造器, 建⽴图形界⾯
{
// 新建⾯板
myPanel = new JPanel();
// 新建按钮
button1 = new JButton("按钮1"); // 新建按钮1
button2 = new JButton("按钮2");
// 每⼀个事件源需要⼀个
// 定义⼀个匿名内部类来监听事件源产⽣的事件
button1.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(frame,
"按钮1 被点击");
}
}
);
button2.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(frame,
"按钮2 被点击");
}
}
)
;
myPanel.add(button1); // 添加按钮到⾯板myPanel.add(button2);
}
public static void main(String s[])
{
Simple2 gui = new Simple2(); // 新建Simple2组件
frame = new JFrame("Simple2"); // 新建JFrame
// 处理关闭事件的通常⽅法
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e)
{it(0);} });
frame.pack();
frame.setVisible(true);
}
}
使⽤匿名内部类同样存在许多另外的问题。⾸先,根据组件在代码中被定义的不同位置,类的定义以及处理事件的代码将分散在程序的各个部分,不是集中在⼀块,同样不便于阅读与维护。各事件的处理全部由嵌套的程序块组成,视觉上很难定位程序代码。如果事件处理程序⽐较复杂,内部类中的代码将变得很长,你将不到相应的组件定义位置。最后,当⼯具栏、菜单栏⽬等需要处理同样的⽤户⾏为时,该⽅法将使代码更难维护。
我们使⽤⼀般的命名内部类可以解决以上许多问题。所有的事件处理⽅法都集中在⼀块,并且都具有有意义的名称,程序⾮常容易阅读与维护。单个的事件处理程序也可以被⼯具栏、菜单栏等重复使⽤,
以下是实现代码:
/*
* Simple3.java - 处理事件的第三种⽅法
* For this example, we will use inner member classes to
* 在这个例⼦中,利⽤⼀般内部类来监听每个事件源产⽣的事件
* 该⽅法避免了第⼆种⽅法中由于使⽤匿名内部类⽽导致的代码混乱
* 便于集中处理事件代码
* 每⼀个Hander可以被⼯具栏或菜单多次使⽤
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Simple3
{
private static JFrame frame; // 定义为静态变量以便main使⽤
private static JPanel myPanel; // 该⾯板⽤来放置按钮组件
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论