2011-12-22 4 views
0

저는 처음에 DatePicker를 만들었습니다. 사용자가 JtextField를 클릭하자 마자 JTextField 옆에 캘린더 대화 상자가 열립니다. 날짜를 선택하는 대신 날짜를 입력하려는 사람은 먼저 열린 대화 상자를 닫은 다음 날짜를 입력해야합니다.자바 스윙 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에서 클래스를 보여 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