gpt4 book ai didi

java - 如何使用键盘编辑 JDateChooser 表格单元格

转载 作者:行者123 更新时间:2023-11-30 09:15:06 26 4
gpt4 key购买 nike

在我的 Java 面板中,我有一个 JTable,其中两列使用来自包 com.toedter.calendarJDateChooser 对象,通过自定义单元格编辑器。与使用文本框或其他简单组件的单元格不同,您无需事先单击单元格即可在其中键入内容,日期选择器单元格不具备此功能。就我目前的理解而言,这是因为我的自定义编辑器将 JDateChooser 对象作为组件返回(通过 getTableCellEditorComponent 方法)。由于 JDateChooser 的父类是 JPanel ( according to the API ),这就是它试图编辑的内容,当然,您不能在 中键入文本J面板。有什么方法可以检测用户何时切换到日期选择器单元格并尝试在其中键入日期?

附言我确实通过请求将焦点放在日期选择器的文本字段上来管理一种变通方法,但要注意的是您键入的第一个键没有出现在单元格中;它只是开始编辑单元格。如果可能的话,我希望它的行为使您可以切换到单元格,例如输入一次“1”,然后在其中显示“1”,就像常规文本字段单元格一样。

最佳答案

Apparently it was removed in a later version and the API was never changed.

你说得对,我注意到了 API已过时,因为它来自 1.2.1 版本和最新版本的 JCalendar是1.4我猜他们没有时间更新API的在线版本,但是随库分发的javadoc更新了。事情是getSpinner()不再可用,所以我的 previuos suggestion无法访问。

无论如何,我已经决定自己尝试使用 JDateChooserDateCellEditor 并且我没有太多麻烦让它工作,除了我经历过同样的事情当您开始在单元格中键入时的行为。焦点似乎转移到了 JDateChooser 顶级组件(如您所说,它可能是一个 JPanel)。所以我使用了 AncestorListener将焦点转移到日期编辑器的 API。这种方法在 this post 中有很好的解释。通过@camickr。

这是我做的:

public class DateCellEditor extends AbstractCellEditor implements TableCellEditor {

JDateChooser editor;

public DateCellEditor() {
editor = new JDateChooser();
editor.setLocale(Locale.ENGLISH);
editor.setDateFormatString("MM/dd/yyyy");
editor.setFocusable(false); // Key #1

JComponent editorComponent = (JComponent)editor.getDateEditor();
editorComponent.addAncestorListener(new AncestorListener() { // Key #2

@Override
public void ancestorAdded(AncestorEvent event) {
((JComponent)editor.getDateEditor()).requestFocusInWindow();
}

@Override
public void ancestorRemoved(AncestorEvent event) {}

@Override
public void ancestorMoved(AncestorEvent event) {}

});
}

....
}

这里有两个关键因素:

  1. 使 editor 不可聚焦。这样您就可以避免焦点自动转移到作为其一部分的顶级容器。
  2. 使用 AncestorListener API。

这是完整的单元格编辑器实现:

import com.toedter.calendar.JDateChooser;
import java.awt.Component;
import java.awt.event.MouseEvent;
import java.util.EventObject;
import java.util.Locale;
import javax.swing.AbstractCellEditor;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.table.TableCellEditor;

public class DateCellEditor extends AbstractCellEditor implements TableCellEditor {

JDateChooser editor;
int clickCountToStart = 2;

public DateCellEditor() {
editor = new JDateChooser();
editor.setLocale(Locale.ENGLISH);
editor.setDateFormatString("MM/dd/yyyy");
editor.setFocusable(false);

JComponent editorComponent = (JComponent)editor.getDateEditor();
editorComponent.addAncestorListener(new AncestorListener() {

@Override
public void ancestorAdded(AncestorEvent event) {
((JComponent)editor.getDateEditor()).requestFocusInWindow();
}

@Override
public void ancestorRemoved(AncestorEvent event) {}

@Override
public void ancestorMoved(AncestorEvent event) {}

});
}

@Override
public Object getCellEditorValue() {
return editor.getDate();
}

@Override
public boolean isCellEditable(EventObject anEvent) {
if (anEvent instanceof MouseEvent) {
return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
}
return true;
}

@Override
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}

@Override
public boolean stopCellEditing() {
fireEditingStopped();
return true;
}

@Override
public void cancelCellEditing() {
fireEditingCanceled();
}




@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
if(value instanceof java.util.Date){
editor.setDate((java.util.Date)value);
table.setRowHeight((int)editor.getPreferredSize().getHeight());
//This last one is optional. It fits the row height to the JDateChooser preferred height.
}
return editor;
}
}

关于java - 如何使用键盘编辑 JDateChooser 表格单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com