简体   繁体   中英

How to set the Date Picker just below the button

I want to open a date picker by clicking on button. But when I click on button, it will show a calendar in top left corner of the screen. I want to see it just below the button. How can I do it?

Also How can I change the size of calendar to make it little bit small?

Below is the example.


package practiceproblems; 

import java.awt.*;  
import java.awt.event.*;  
import javax.swing.*;

class DatePicker {  

int month = java.util.Calendar.getInstance().get(java.util.Calendar.MONTH);
int year = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
JLabel l = new JLabel("", JLabel.CENTER);  
String day = "";
JDialog d;
JButton[] button = new JButton[49];

public DatePicker(JFrame parent) {  
d = new JDialog();
d.setModal(true);
String[] header = { "Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat" };
JPanel p1 = new JPanel(new GridLayout(7, 7));
p1.setPreferredSize(new Dimension(430, 120));
for (int x = 0; x < button.length; x++) {
    final int selection = x;
    button[x] = new JButton();
    button[x].setFocusPainted(false);
    button[x].setBackground(Color.white);
    if (x > 6)
        button[x].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                day = button[selection].getActionCommand();
                d.dispose();
            }
        });
        if (x < 7) {
            button[x].setText(header[x]);
            button[x].setForeground(Color.red);
        }
        p1.add(button[x]);
}
JPanel p2 = new JPanel(new GridLayout(1, 3));
JButton previous = new JButton("<< Previous");
previous.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        month--;
        displayDate();
    }
});
p2.add(previous);
p2.add(l);
JButton next = new JButton("Next >>");
next.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
        month++;
        displayDate();
    }
});
p2.add(next);
d.add(p1, BorderLayout.CENTER);
d.add(p2, BorderLayout.SOUTH);
d.pack();
d.setLocationRelativeTo(parent);
displayDate();
d.setVisible(true);

}

public void displayDate() {
for (int x = 7; x < button.length; x++)
    button[x].setText("");
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("MMMM yyyy");
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(year, month, 1);
int dayOfWeek = cal.get(java.util.Calendar.DAY_OF_WEEK);
int daysInMonth = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH);
for (int x = 6 + dayOfWeek, day = 1; day <= daysInMonth; x++, day++)
    button[x].setText("" + day);
l.setText(sdf.format(cal.getTime()));
d.setTitle("Date Picker");

}

public String setPickedDate() {
if (day.equals(""))
    return day;
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MM-yyyy");
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.set(year, month, Integer.parseInt(day));
return sdf.format(cal.getTime());
}

}

 class Picker {   

   public static void main(String[] args) {  
    JLabel label = new JLabel("Selected Date:");
    final JTextField text = new JTextField(20);
    JButton b = new JButton("popup");
    JPanel p = new JPanel();
    p.add(label);
    p.add(text);
    p.add(b);
    final JFrame f = new JFrame();
    f.getContentPane().add(p);
    f.pack();
    f.setVisible(true);
    b.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            text.setText(new DatePicker(f).setPickedDate());
        }
    });
}

}

So the code required for you to make the calendar show under the button is below. But before you can use it, there are few changes to your code which you must (1), should (2) and could (3) make.

  1. In the DatePicker constructor get rid off d.setVisible(true); since we are going to do some settings in the action listener before actually showing the dialog.
  2. When you are creating the frame it is always useful to add this line f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); so your application will always close, otherwise you end up with tone of applications consuming your computer resources.
  3. I would recommend for the Date Picker to extend JDialog instead of having the dialog as a variable. Because effectively that what the date picker looks like to be in your code.


        b.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                DatePicker dp = new DatePicker(f);
                Point bP = b.getLocationOnScreen();
                dp.d.setLocation(bP.x, bP.y + b.getHeight()); 
                dp.d.setVisible(true);
                text.setText(dp.setPickedDate());
            }
        });

When it goes to the second part of your question considering size change Andrew Thompson answered it great, since you are already calling pack, any size modification are undesired.

Enjoy, Boro.

I want to see it just below the button. How can I do it? ..

Component.setLocation(int, int) or Window.setLocationRelativeTo(Component) .

..How can I change the size of calendar to make it little bit small?

Component.setSize(int, int) , or as trashgod suggested, a call to Window.pack() .

The latter is better since pack() does the 'heavy lifting' of calculating how small the window (frame, dialog etc.) can be without truncating the contents. It is not an easy task to determine the minimum size.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM