GUI程序设计-事件处理

 

       要做毕业设计了,选择了技术路线,所以就选了一个比较大的题目:基于JAVA的通用流程分析软件分析与设计。

      老师大概觉得我应该有JAVA基础,所以要求比较高。学习下JGraph的代码,类似Alphaminer, 利用XML进行节点设计;学习下图论,特别是Dijktra算法啊什么的。老师还给了个Demo,所以也没有觉得怎么样。等到真正开始着手了,才知道自己知识积累之少、之浅。大二学的java和Data Structure全还给老师了,这会儿等于从头开始学起,痛苦啊。 还记得一个同学的签名,当一个人最痛苦的时候也是他最收获的时候。所以一定要坚持住,坚持下去,不要放弃。

       这段时间纠结在Swing上了,有好多东西要学习,而且因为以前学习的太浅了,几乎没有怎么接触过,学起来好吃力。特别是事件处理机制。一开始的button ActionListener还好,事件委托机制。大概的看了内部类的概念,然后深一点匿名内部类……一边学习那些GUI API,一边一点一点的了解事件处理的机制。

       简单的图像设计:

       1. 建立一个Container,一般是扩展于(继承 extends)JFrame, 用来盛放其他的组件(component);

       2. 建立panel, 一般是扩展于JPanel, 其上放其他的组件,JButton啦, JMenu 啦, JLabel啦,绘图啦什么的。

       3. 为panel上的组件建立并注册监听器。一般是利用内部类,或是匿名内部类构造监听器,扩展于相对应的监听器(如JButton的Action'Listener)。注册监听器用object.addXXXListener(objectAction)方法。

Core Java2上的例子:

/**

   @version 1.32 2004-05-04

   @author Cay Horstmann

*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class ButtonTest
public class ButtonTest

{  

   public static void main(String[] args)

   {  

      ButtonFrame frame = new ButtonFrame();

      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      frame.setVisible(true);

   }

}

/**
   A frame with a button panel
*/

class ButtonFrame extends JFrame{
   public ButtonFrame()
   {
      setTitle("ButtonTest");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
      // add panel to frame
      ButtonPanel panel = new ButtonPanel();
      add(panel);
   }
   public static final int DEFAULT_WIDTH = 300;
   public static final int DEFAULT_HEIGHT = 200;  
}
/**
   A panel with three buttons.
*/
class ButtonPanel extends JPanel{  
   public ButtonPanel()
   {        // create buttons
      JButton yellowButton = new JButton("Yellow");
      JButton blueButton = new JButton("Blue");
      JButton redButton = new JButton("Red");
      // add buttons to panel
      add(yellowButton);
      add(blueButton);
      add(redButton);
      // create button actions
      ColorAction yellowAction = new ColorAction(Color.YELLOW);
      ColorAction blueAction = new ColorAction(Color.BLUE);
      ColorAction redAction = new ColorAction(Color.RED);
      // associate actions with buttons
      yellowButton.addActionListener(yellowAction);
      blueButton.addActionListener(blueAction);
      redButton.addActionListener(redAction);
   }
   /**
    An action listener that sets the panel's background color. 
   */
   private class ColorAction implements ActionListener   {  
      public ColorAction(Color c)  {  
         backgroundColor = c;
      }
      public void actionPerformed(ActionEvent event) {  
         setBackground(backgroundColor);
      }
      private Color backgroundColor;
   }
}

 处理工程:

1.用标签字符串构造按钮

2.将按钮添加到面板上

3.用适当的颜色够色一个监听器

4.添加动作监听器

感觉代码重复,进行改进,添加辅助方法

void makeButton(Sring name,  final Color backgroudColor){
         JButton button = new JButton(String name);
         add(button);
         button.addActionListener( new
               Actionlistener(){
                      Public void actionPerformed(ActionEvent event){
                         setBackground(backgroundColor);
                         }
                     });
    }

 利用匿名内部类将代码简化。

 

最后,一些疑问:

      因为对MVC机制接触的还不多,所以和疑惑这种委托代理机制在大型的系统中的结构。在一个拥有N多构件的panel中,如果每个组件都利用这样的监听处理方法,那panel类该有多大啊?觉得应该还有其他的处理方法,但是不知道如果不利用内部类,那么组件如何和其他组件进行通信呢?譬如,Ecipse关闭时需要点击太出来的Dialog中的确定才能出发System.exit(0)(呵呵,臆想),起中的通信机制还是在panel中构造监听器吗?

 

你可能感兴趣的:(mvc,算法,swing)