【发布时间】:2011-12-22 22:52:00
【问题描述】:
我最初构建了一个 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。在此 DatePicker 上有从 JComponent 到 JTextfield 的强制转换以及对 get 和 setText() 的调用。
如果我必须更改 DatePicker 以扩展 JPanel 表单,那么它将在任何地方破坏我的应用程序。我想知道我是否可以通过绘画或其他方式修饰 JTextfield 以在侧面显示按钮?这可能吗?
【问题讨论】:
-
为什么要重新发明轮子?您可以使用 JXDatePicker(在 SwingX 项目中)为您完成所有繁重的工作:-)
-
我之前尝试过,但它不允许用户正确选择年份或其他内容。这是我在大约 1.5 年前尝试过的。因此构建了我自己的组件。现在它的使用遍布我的代码库..寻找不涉及再次更改所有地方的东西..