2011-12-22 5 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); 
      } 
     } 
    }); 
} 

私は日付ピッカーのクラスを示したhavent。問題は、日付を入力するたびにカレンダーダイアログを閉じることが非常に面倒だったことです。私がやりたかったのは、JtextFieldの側面にボタンを置くことでした。ボタンをクリックするだけで、ダイアログがポップアップします。

しかしこれを行うには、JPanelクラスを拡張するためにDatePickerが必要で、JTextfieldとJButtonを並べてレイアウトすることができます。しかし、残念ながら、DatePickerクラスはJtextFieldを拡張し、私のアプリケーション全体でDatePickerがJtextFieldであることを期待しています。 JComponentからJTextfieldへのキャストがあり、このDatePickerでgetおよびsetText()を呼び出します。

JPanelフォームを拡張するためにDatePickerを変更する必要がある場合は、どこにでもアプリケーションが壊れてしまいます。 JTextfieldをドレスアップして、サイドにあるボタンをペイントして表示することができるかどうか疑問に思っていましたか?これは可能ですか?

+0

なぜホイールを再発明するのですか?あなたはあなたのためにすべての重労働を行うJXDatePicker(SwingXプロジェクトで)を使うことができます:-) – kleopatra

+0

私はそれを以前に試みましたが、ユーザーが年を選択することができませんでした。これは私が約1.5年前に試みたものです。したがって、私自身のコンポーネントを構築しました。今ではその使用法が私のコードベースに盛り込まれています。再びすべての場所を変更することを伴わない何かを探しています。 – sethu

答えて

0

ために、ポップアップのためJWindowを使用どのように後で..コードが以下に記載されているかを見たいと思っている人。ペイントをオーバーライドし、テキストフィールドの左隅に画像を描画します。次に、画像がクリックされた場合にのみ、mouseClickedを応答に実装します。また、マウスの動きリスナを実装して、イメージ上にカーソルをハンドポインタに、カーソルがない場合はテキストカーソルに変更します。

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); 
    } 

とは、あなたのMouseListener内のイベントのe.getX() e.getY() coordiantesを追跡します。そこSpinnerDateModel

+0

ありがとう..私はそれを試してみましょう.. – sethu

+0

代わりにpaint()アイデア...それは働いた... – sethu

+0

あなたは大歓迎です;) –

1

1)public class DateTextField extends JSpinner implements Observer {

2)JSpinner、/別のインスタンスへ

3から解析とない問題)が存在場所の7×7 JLabels又はJButtons

+0

ansのおかげで...しかし、私は実際には、この変更のための私のコードベース全体を更新する必要があるという意味になる階層の原因を変更したい。 – sethu

関連する問題