java swing DatePicker сделан неправильно с использованием JTextField и хочет изменить - PullRequest
0 голосов
/ 22 декабря 2011

Я изначально построил DatePicker.Диалоговое окно календаря откроется рядом с JTextField, как только человек нажмет на 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 и вызовы get и setText () для этого DatePicker.

Если мне нужно изменить DatePicker для расширения формы JPanel, то это повредит моему приложению везде.Мне было интересно, смогу ли я как-нибудь одеть JTextfield, чтобы показать кнопку сбоку, нарисовав ее или что-то еще?Это возможно?

Ответы [ 3 ]

1 голос
/ 22 декабря 2011

1) public class DateTextField extends JSpinner implements Observer {

2) JSpinner с SpinnerDateModel, тогда нет проблем с разбором из / в другой экземпляр

3) используйте JWindow для всплывающего окна,там место 7х7 JLabels или JButtons

1 голос
/ 22 декабря 2011

Полагаю, вам следует переопределить метод 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() координаты события в вашем MouseListener.

0 голосов
/ 22 декабря 2011

Для тех, кто хочет увидеть, как позже .. код указан ниже.Вы переопределяете рисование и рисуете изображение в левом углу текстового поля.Затем осуществите щелчок мышью, чтобы реагировать только в том случае, если изображение было нажато.Также реализуйте слушатель движения мыши, чтобы изменить курсор на указатель руки, если он на изображении, и текстовый курсор, если это не так.

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();
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...