2011-12-22 87 views
0

我最初構建了DatePicker。只要用戶點擊JtextField,日曆對話框就會在JTextField旁邊打開。如果一個人想輸入日期而不是選擇日期,那麼他應該先關閉打開的對話框,然後輸入日期。java swing DatePicker做錯了使用JTextField並且想要更改

下面是它的外觀:

public class DateTextField extends JTextField implements Observer { 

public void update(Observable o, Object arg) { 
    Calendar calendar = (Calendar) arg; 
    DatePicker dp = (DatePicker) o; 
    setText(dp.formatDate(calendar)); 
} 

public DateTextField() { 
    final Observer obs = this; 
    final JTextField tf = this; 
    this.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseReleased(MouseEvent e) { 
      if(tf.isEditable()){ 
       DatePicker dp = new DatePicker(obs); 
       Date selectedDate = dp.parseDate(tf.getText()); 
       dp.setSelectedDate(selectedDate); 
       dp.start(tf); 
      } 
     } 
    }); 
} 

我還沒有所示的DatePicker類,因爲這裏不是問題。問題是,一個人每次關閉日曆對話框來輸入日期都是非常令人煩惱的。相反,我想要做的只是在JtextField一側保留一個按鈕,並且只有當用戶點擊按鈕時,對話框纔會彈出。

但這樣做,我將需要的DatePicker來擴展JPanel類,我可以佈局的JTextField和側面的JButton側。但不幸的是,DatePicker類擴展了JtextField,並且我期待DatePicker成爲JtextField。有從JComponent轉換到JTextfield並在此DatePicker上調用get和setText()。

如果我必須要改變的DatePicker延長形式的JPanel那就處處打破我的申請。我想知道如果我可以打扮的JTextfield顯示側面的按鈕可能通過繪畫或什麼?這是可能的嗎?

+0

爲什麼要重新發明輪子?你可以使用JXDatePicker(在SwingX項目中),它爲你做了所有繁重的工作:-) – kleopatra 2011-12-22 13:30:29

+0

我早些時候嘗試過,它不允許用戶正確選擇年份或其他東西。這是我在1.5年前嘗試過的。因此建立了我自己的組件。現在,它的使用亂七八糟在我的代碼基地..尋找一些不涉及再次改變所有的地方.. – sethu 2011-12-22 13:52:10

回答

0

對於任何人想看看以後如何列出代碼。您可以覆蓋油漆並在文本字段的左側繪製圖像。然後,如果圖像已被點擊,則將鼠標單擊實現爲僅響應。如果鼠標移動監聽器還有一個鼠標移動偵聽器,則將其更改爲一個手形指針,如果它位於圖像上,則將其轉換爲手形指針,如果不是,則使用文本光標。

public class DateTextField extends JTextField implements Observer { 

public void update(Observable o, Object arg) { 
    Calendar calendar = (Calendar) arg; 
    DatePicker dp = (DatePicker) o; 
    setText(dp.formatDate(calendar)); 
} 

public DateTextField() { 
    final Observer obs = this; 
    final JTextField tf = this; 
    this.addMouseListener(new MouseAdapter() { 
     @Override 
     public void mouseClicked(MouseEvent e) { 
      if(tf.isEditable()){ 
       Point p = e.getPoint(); 
       if(p.x>=getWidth()-22 && p.x <getWidth() 
         && p.y<=getHeight()) { 
        DatePicker dp = new DatePicker(obs); 
        Date selectedDate = dp.parseDate(tf.getText()); 
        dp.setSelectedDate(selectedDate); 
        dp.start(tf); 
       } 
      } 
     } 
    }); 

    this.addMouseMotionListener(new MouseMotionAdapter() { 
     @Override 
     public void mouseMoved(MouseEvent e) { 
      Point p = e.getPoint(); 
      if(p.x>=getWidth()-22 && p.x <getWidth() 
        && p.y<=getHeight()) { 
       DateTextField.this.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
      }else { 
       DateTextField.this.setCursor(new Cursor(Cursor.TEXT_CURSOR)); 
      } 
     } 
    }); 
} 

public DateTextField(String text) { 
    this(); 
    this.setText(text); 
} 

@Override 
public void paint(Graphics g) { 
    super.paint(g); 
    try { 
     BufferedImage img = ImageIO.read(new File(DateTextField.class.getResource("/images/calendar.png").getFile())); 
     int x=getWidth()-22; 
     g.drawImage(img,x,1,20,getHeight()-2,null); 
    }catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
} 
1

我想,你應該重寫paintComponent方法和改變MouseListener一點。 事情是這樣的:

protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     int y = (getHeight() - image.getHeight())/2; 
     g.drawImage(image, x, y, this); 
    } 

並以某種方式跟蹤該事件的e.getX() e.getY() coordiantes在你的MouseListener。

+0

謝謝..讓我試試.. – sethu 2011-12-22 13:52:36

+0

不得不重寫paint()..而是感謝想法...它的工作.. – sethu 2011-12-22 14:48:37

+0

不客氣;) – 2011-12-22 17:20:26

1

1)public class DateTextField extends JSpinner implements Observer {

2)JSpinnerSpinnerDateModel,則有與解析來自/到另一個實例

3)沒有問題使用JWindow爲彈出,有地方爲7x7 JLabelsJButtons

+0

感謝您的答覆...但我真的不想改變層次結構的原因,這將意味着我需要更新我的整個代碼基地進行此更改。 – sethu 2011-12-22 14:53:03