1

我在表日期列中使用JCalendarJDateChooser作为tablecelleditor. 问题是,当单击的列单元格JDateChooser出现但如果它失去焦点时,它不会触发焦点丢失事件。如何使其火灾焦点丢失事件?这样做之后,有什么办法可以防止JCalendar在单击JCalendar按钮后出现时其触发焦点丢失?

我尝试做的事情是,如果有人通过从日历中选择一个日期来指定一个日期,stopCellEditing();否则等到焦点丢失事件停止或cancelCellEditing();

在此处输入图像描述

4

2 回答 2

1

在@mKorbel 提到的源代码分发com.toedter.calendar.demo.DemoTable中,是一个com.toedter.calendar.JDateChooserCellEditor用作单元格编辑器的示例。基本步骤是这些。

JTable table = new JTable(…);
table.setDefaultEditor(Date.class, new JDateChooserCellEditor());

附录:这是一个显示预期行为的sscce 。

import com.toedter.calendar.demo.DemoTable;
import java.awt.EventQueue;
import javax.swing.JFrame;

/** @see http://stackoverflow.com/questions/7643893 */
public class CalendarTable {

    private void display() {
        JFrame f = new JFrame("CalendarTable");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(new DemoTable());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new CalendarTable().display();
            }
        });
    }
}
于 2011-10-08T04:18:06.323 回答
1

我发现了一个在选择日期时触发的propertyChanged事件。并使表格在 focusLost 上终止JDateChooser编辑jTable1.putClientProperty("terminateEditOnFocusLost", true);

编辑:如果您想更改使表格单元格失去焦点并终止编辑的年份,则当日历弹出窗口关闭时:(

jDateChooser.addPropertyChangeListener(new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("date")) {
            stopCellEditing();
        }
    }
});

编辑(已解决):当焦点丢失时,不要使用jTable1.putClientProperty("terminateEditOnFocusLost", true);将 ta 添加FocusListenerJTableinTableCellEditor并取消编辑,而是有机会检查JDateChooser's弹出窗口是否可见。但在此之前,JDateChooser应该使用弹出isVisible方法进行扩展。因为弹出变量是受保护的。并且单元格编辑器组件不应该是可聚焦的,否则JTable也会失去焦点

于 2011-10-08T04:42:19.870 回答