【问题标题】:JCalendar Focus EventJCalendar 焦点事件
【发布时间】:2011-10-04 06:09:50
【问题描述】:

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

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

【问题讨论】:

  • 据我所知,JCalendar 是否也包含 TableEditor/Renderer
  • 你是从 jar 中使用 JCalendar,还是从 Source Files 中使用 JCalendar,如果是从 jar 中,则下载源文件 (JCalendarCellEditor.java)
  • 我使用 jar 并找到了类。我还应该下载源文件吗?
  • 之前检查你是否能够使用这个类,我认为普通的java文件和类之间有什么区别
  • 这是一个非常简单的 CellEditor :/ 我需要类似 JDateChooser.addDateSelectionListener( public void dateSelected(DateEvent evt){ ... } );

标签: java jcalendar jdatechooser


【解决方案1】:

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

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

jDateChooser.addPropertyChangeListener(new PropertyChangeListener() {

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

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

【讨论】:

    【解决方案2】:

    在@mKorbel 提到的source distribution 中,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();
                }
            });
        }
    }
    

    【讨论】:

    • 顺便说一句,当 JDateChooser 中的日期更改时,我发现了一个 propertyChanged 事件。现在我只需要让 JDateChooser 触发 focusLost
    • 我无法重现你使用JDateChooserCellEditor描述的效果; sscce 可能会有所启发。
    • 这应该是表格单元格编辑器的正常行为。表格单元格编辑器应在失去焦点时取消单元格编辑,并在编辑完成后停止单元格编辑。因此,当有人选择日期时,它应该停止单元格编辑。这可以通过 propertyChanged 事件来完成。但是当单元格编辑器失去焦点时,例如当我更改包含单元格编辑器表格的选项卡时,单元格编辑器不会取消单元格编辑
    • 和 jTable1.putClientProperty("terminateEditOnFocusLost", true);修复它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多