国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用Decorator模式實現日期選擇組件(5)

2019-11-18 12:14:43
字體:
來源:轉載
供稿:網友

  彈出對話框
  對話框包裝器有2個類組成:第一個是Popup_dialog,繼續與JDialog實現小的如前所示的框架。
  生成常規對話框的主要難點是所有的裝飾(框架與標題欄)的消失問題,因此假如你需要生成自己的標題欄,下面提供了具體實現的大部分代碼:
  標題欄是包含一個顯示標題的標簽和一個按鈕(關閉按鈕,如導航箭頭一樣加載圖象資源)。
  代碼如下:
  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.
     */
  
  
    public Container getContentPane(){ return content_pane; }
  有點意思實現拖拉功能的代碼。主要的思路是設置2個監聽器。撲捉按紐的鼠標監聽器與使用變量reference_position存儲鼠標點擊在標題標簽中的上層窗口位置。
  當鼠標移動時,鼠標移動監聽器將被激活。問題是和拖動聯系一起的事件一般和屏幕聯系在一起而不是和上層窗口聯系一起。拉句柄在當前鼠標位置移動對話框到原始的reference_position位置。就象從原始位置拖動窗體到現在鼠標位置一樣。
  下面是代碼:
  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 );
    }
  }
  
  
  
  日期對話框
  
    剩下的都是些微不足道的包裝。Date_selector_dialog 修飾者把包裝的Date_selector放在彈出框中。它從Titled_date_selector中復制了一些代碼用來顯示對話框標題欄(當前日期和月份)這里根本就沒有考慮導航條問題。因為Date_selector已經包含了導航條等等。。
  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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜昌市| 阜平县| 西和县| 鹿泉市| 晋中市| 偏关县| 泽普县| 丰城市| 太谷县| 永城市| 隆化县| 固原市| 黑龙江省| 中宁县| 乌兰浩特市| 奉贤区| 武宣县| 图木舒克市| 军事| 随州市| 徐闻县| 清原| 保亭| 延津县| 华容县| 武平县| 阿拉善左旗| 吉木乃县| 仁化县| 穆棱市| 安龙县| 益阳市| 武清区| 微山县| 黄冈市| 黔西县| 班玛县| 岫岩| 韶关市| 延寿县| 永德县|