标题
这Date_selector_panel是重要部分。现在我们来看看他的装饰。Titled_date_selector类只做一件事情:给未装饰的日历增加个标题。
标题 这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); }
}
查看本文来源