当前页面: 开发资料首页 → J2EE 专题 → 解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(五)
摘要: 解决日期选择问题,一劳永逸(使用Decorator模式实现日期选择组件)(五)
public class Popup_dialog extends JDialog
{
private Color TITLE_BAR_COLOR = com.holub.ui.Colors.LIGHT_YELLOW;
private Color CLOSE_BOX_COLOR = com.holub.ui.Colors.DARK_RED;
private JLabel title = new JLabel("xxxxxxxxxxxxxx");
{ title.setHorizontalAlignment(SwingConstants.CENTER);
title.setOpaque( false );
title.setFont( title.getFont().deriveFont(Font.BOLD) );
}
private JPanel header = new JPanel();
{ header.setBackground( TITLE_BAR_COLOR );
header.setLayout( new BorderLayout() );
header.setBorder( BorderFactory.createEmptyBorder(2,2,2,2) );
header.add( title , BorderLayout.CENTER );
header.add( create_close_button() , BorderLayout.EAST );
}
private JPanel content_pane = new JPanel();
{ content_pane.setLayout( new BorderLayout() );
}
public Popup_dialog( Frame owner ){ super(owner); setModal(true); }
public Popup_dialog( Dialog owner){ super(owner); setModal(true); }
/* Code common to all constructors. */
{
init_dragable();
setUndecorated( true );
JPanel contents = new JPanel();
contents.setBorder( BorderFactory.createLineBorder(Color.BLACK,1) );
contents.setLayout(new BorderLayout());
contents.add(header, BorderLayout.NORTH);
contents.add(content_pane, BorderLayout.CENTER);
contents.setBackground( Color.WHITE );
setContentPane( contents ); // , BorderLayout.CENTER );
setLocation(100,100);
}
private JButton create_close_button()
{
URL image = getClass().getClassLoader().getResource(
"images/8px.red.X.gif");
JButton b = (image!=null) ? new JButton( new ImageIcon(image) )
: new JButton( " X " )
;
Border outer = BorderFactory.createLineBorder(CLOSE_BOX_COLOR,1);
Border inner = BorderFactory.createEmptyBorder(2,2,2,2);
b.setBorder( BorderFactory.createCompoundBorder(outer,inner) );
b.setOpaque( false );
b.addActionListener
( new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ Popup_dialog.this.setVisible(false);
Popup_dialog.this.dispose();
}
}
);
b.setFocusable( false );
return b;
}
/** Set the dialog title to the indicated text. */
public void setTitle( String text ){ title.setText( text ); }
/** Add your widgets to the window returned by this method, in
* a manner similar to a JFrame. Do not modify the Popup_dialog
* itself. The returned container is a {@link JPanel JPanel}
* with a preinstalled {@link BorderLayout}.
* By default, it's colored dialog-box gray.
* @return the content pane.
*/
private Point reference_position = new Point(0,0);
private MouseMotionListener movement_handler;
private MouseListener click_handler;
private void init_dragable()
{
movement_handler =
new MouseMotionAdapter()
{ public void mouseDragged( MouseEvent e )
{ // The reference position is the (window-relative)
// cursor position when the click occurred. The
// current_mouse_position is mouse position
// now, and the deltas represent the distance
// moved.
Point current_mouse_position = e.getPoint();
Point current_window_location = getLocation();
int delta_x=current_mouse_position.x - reference_position.x;
int delta_y=current_mouse_position.y - reference_position.y;
// Move the window over by the computed delta. This move
// effectively shifts the window-relative, current mouse
// position back to the original reference position.
current_window_location.translate(delta_x, delta_y);
setLocation(current_window_location);
}
};
click_handler =
new MouseAdapter()
{ public void mousePressed( MouseEvent e )
{ reference_position = e.getPoint(); // Start of the drag
}
};
setDragable(true);
}
/** Turn dragability on or off.
*/
public void setDragable( boolean on )
{ if( on )
{ title.addMouseMotionListener ( movement_handler );
title.addMouseListener ( click_handler );
}
else
{ title.removeMouseMotionListener ( movement_handler );
title.removeMouseListener ( click_handler );
}
}
public class Date_selector_dialog extends Popup_dialog implements Date_selector
{
private Date_selector selector = new Date_selector_panel();
/** Creates a dialog box with the indicated parent that holds
* a standard {@link Date_selector_panel Date_selector_panel}
* (as created using the no-arg constructor).
*/
public Date_selector_dialog( Frame parent )
{ super(parent);
selector = new Navigable_date_selector( new Date_selector_panel() );
init();
}
/* Like {@link #Date_selector_dialog(Frame),
* but for a {@link Dialog} parent.
*/
public Date_selector_dialog( Dialog parent )
{ super(parent);
selector = new Navigable_date_selector( new Date_selector_panel() );
init();
}
/** Creates a dialog box with the indicated parent that holds
* the indicated Date_selector.
* Note that the current month and year display in the
* dialog-box title bar, so there's no need to display them in
* the selector too.
*/
public Date_selector_dialog( Frame parent, Date_selector to_wrap )
{ super(parent);
selector = to_wrap;
init();
}
/* Like {@link #Date_selector_dialog(Frame,Date_selector),
* but for a {@link Dialog} parent.
*/
public Date_selector_dialog( Dialog parent, Date_selector to_wrap )
{ super(parent);
selector = to_wrap;
init();
}
/** Code common to all constructors.
*/
private void init()
{ getContentPane().add( (Container)selector, BorderLayout.CENTER );
selector.addActionListener
( new ActionListener()
{ public void actionPerformed( ActionEvent event )
{ if( event.getID() == Date_selector.CHANGE_ACTION )
{ setTitle( event.getActionCommand() );
}
else
{ setVisible(false);
dispose();
}
}
}
);
((Container)selector).setVisible(true);
pack();
}
/** For use when you pop up a dialog using
* setVisible(true) rather than {@link #select}.
* @return the selected date or null if the dialog was closed
* without selecting anything.
*/
public Date get_selected_date()
{ return selector.get_selected_date();
}
/** Get the current date. The dialog stays in existence
* until the user closes it or selects a date, so this
* method can be used to see what month the user has
* scrolled to.
* @return the date currently displayed on the calendar.
*/
public Date get_current_date()
{ return selector.get_current_date();
}
/** Add an action listener for both.
* {@link Date_selector#CHANGE_ACTION} and
* {@link Date_selector#SELECT_ACTION} action events.
*/
public void addActionListener(ActionListener l)
{ selector.addActionListener(l);
}
/** Remove a previously added listener. */
public void removeActionListener(ActionListener l)
{ selector.removeActionListener(l);
}
/** Pops up the chooser and blocks until the user selects
* a date.
* @return the selected date or null if the dialog was closed
* without selecting anything.
*/
public Date select()
{
setVisible(true);
return selector.get_selected_date();
}
public void roll(int f, boolean up) { selector.roll(f,up); }
public int get(int f) { return selector.get(f); }
}
ealy ,java 爱好者,Matrix jsp翻译小组成员,可以点击http://www.matrix.org.cn/user_view.asp?username=ealy查看她的个人信息Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd, scwcd 弹出