科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用Decorator模式实现日期选择组件(4)

使用Decorator模式实现日期选择组件(4)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

  标题   这Date_selector_panel是重要部分。现在我们来看看他的装饰。Titled_date_selector类只做一件事情:给未装饰的日历增加个标题。

作者:中国IT实验室 来源:中国IT实验室 2007年8月26日

关键字: Decorator 日期选择组件

  • 评论
  • 分享微博
  • 分享邮件
  标题
  这Date_selector_panel是重要部分。现在我们来看看他的装饰。Titled_date_selector类只做一件事情:给未装饰的日历增加个标题。这是对实现了Date_selector的JPanel面板的包装。它只显示现有的Date_selector和显示日期的标签。下面的实现是微不足道。和用户界面无相关值得说的只有那其中10行动作监听代码。监听器获取日期改变通知(通过用户导航或者方法调用)便做相应的标签日期更新。其他代码只是简单地创建面板和将Date_selector与JLable标题包装进面板中。
  这表明这部分代码易写、易管理比较简单。如果它被混合在Date_selector_panel中,将会在 没有明显的优点的情况下增加了代码的复杂度。(代码有组织地放在某处比全混合在一个地方更加清晰。)如果我想要标题更加美观,只需要修改这一个类即可以实现根本就不需要动其他部分。
  
  public class Titled_date_selector extends JPanel implements Date_selector
  {  private    Date_selector selector;
    private final JLabel title = new JLabel("XXXX");
  
    /** Wrap an existing Date_selector to add a title bar showing
     * the displayed month and year. The title changes as the
     * user navigates.
     */
  
    public Titled_date_selector( Date_selector selector )
    {  this.selector = selector;
  
      title.setHorizontalAlignment(SwingConstants.CENTER);
      title.setOpaque   ( true                   );
      title.setBackground ( com.holub.ui.Colors.LIGHT_YELLOW     );
      title.setFont    ( title.getFont().deriveFont( Font.BOLD )  );
  
      selector.addActionListener
      (  new ActionListener()
        {  public void actionPerformed( ActionEvent e )
          {  if( e.getID() == Date_selector_panel.CHANGE_ACTION )
              title.setText( e.getActionCommand() );
            else
              my_subscribers.actionPerformed(e);
          }
        }
      );
  
      setOpaque(false);
      setLayout( new BorderLayout() );
      add( title, BorderLayout.NORTH );
      add( (JPanel)selector, BorderLayout.CENTER );
    }
  
    /** This constructor lets you specify the background color of the
     * title strip that holds the month name and year (the default
     * is light yellow).
     *
     * @param label_background_color the color of the title bar, or
     *   null to make it transparent.
     */
    public Titled_date_selector( Date_selector selector, Color label_background_color )
    {  this(selector);
      if( label_background_color == null )
        title.setOpaque( false );
      else
        title.setBackground( label_background_color );
    }
  
    private ActionListener my_subscribers = null;
    public synchronized void addActionListener(ActionListener l)
    {  my_subscribers = AWTEventMulticaster.add(my_subscribers, l);
    }
    public synchronized void removeActionListener(ActionListener l)
    {  my_subscribers = AWTEventMulticaster.remove(my_subscribers, l);
    }
  
    public Date get_selected_date()   { return selector.get_selected_date(); }
    public Date get_current_date()   { return selector.get_current_date();  }
    public void roll(int f, boolean up) {    selector.roll(f,up);      }
    public int get(int f)       { return selector.get(f);        }
  }
  
查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章