java - 将 JPanel 用作 JTable 单元格编辑器时出现焦点问题

标签 java swing jtable tablecelleditor

我有一个单元格编辑器,其中包含一个小按钮,可以双击该按钮以显示一个编辑对话框,然后是一个可用于编辑内联值的文本字段(需要弹出窗 Eloquent 能编辑其他值,只有第一个显示在 JTable 中)。

当用户点击字段时一切正常,但如果他们跳入该字段,他们的文本字段不会获得焦点并且他们无法编辑该字段,除非他们用鼠标点击它。

我尝试摆弄 jpanel 的各种焦点方法,但没有任何区别,有人知道我做错了什么吗?

package com.jthink.jaikoz.celleditor;

import com.jthink.jaikoz.celldata.Cell;
import com.jthink.jaikoz.guielement.Focus;
import com.jthink.jaikoz.table.CellLocation;
import com.jthink.jaikoz.table.DatasheetToggleButton;
import com.jthink.jaikoz.table.datasheet.Datasheet;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class SimpleMultiRowCellEditor
    extends DefaultCellEditor implements ActionListener
{

    final JPanel panel;
    private final DatasheetToggleButton rowCount;
    Cell value;

    public SimpleMultiRowCellEditor(final JTextField text)
    {
        super(text);
        this.setClickCountToStart(1);

        rowCount = new DatasheetToggleButton();
        rowCount.setVisible(true);
        rowCount.addActionListener(this);
        panel = new JPanel();
        panel.setOpaque(false);
        panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
        panel.add(rowCount);
        panel.add(editorComponent);
        /*panel.setFocusable(true);
        panel.setFocusCycleRoot(true);
        ArrayList focusOrder = new ArrayList();
        focusOrder.add(editorComponent);
        focusOrder.add(rowCount);
        focusOrder.add(panel);
        panel.setFocusTraversalPolicy(new Focus(focusOrder));
        */
    }

    public Component getTableCellEditorComponent(
        final JTable table, final Object val, final boolean isSelected,
        final int row, final int column)
    {
        value = (Cell) ((Cell) val).clone();
        rowCount.setText(String.valueOf(value.getValues().size()));
        delegate.setValue(value.getValue());
        return panel;
    }

    public Object getCellEditorValue()
    {
        final String s = (String) delegate.getCellEditorValue();
        value.setValue(s);
        return value;
    }

    public void actionPerformed(final ActionEvent e)
    {
        this.stopCellEditing();
        final CellLocation cl =  Datasheet.getActiveEditSheet()
            .getTable().getSelectedCellLocations().get(0);
        UpdateMultiRowCellDialog.getInstanceOf().display(value,cl);
    }
}

尝试将 focuslistener 添加到面板,似乎没有任何区别

class PanelFocusListener implements FocusListener
{
    public void focusGained(FocusEvent e)
    {
        System.out.println("Gained Focus");
        editorComponent.requestFocusInWindow();
    }

    public void focusLost(FocusEvent e)
    {
        System.out.println("Lost Focus");

    }
}

因此,在进入字段后,我键入一个键,它看起来像是获得了焦点,但你不能在该字段中输入任何内容,而如果我键入 RETURN,那么我可以开始编辑该字段,按 RETURN 有什么允许它可以工作吗?

最佳答案

what does pressing RETURN do that allows it to work?

如得心应手Key Bindings所示应用程序,大多数 L&F 中默认的 ENTER 键绑定(bind)是 notify-field-accept。不清楚为什么您的 ActionListener 开始 stopCellEditing()。我希望它在更新数据模型后调用 fireEditingStopped() ,如 example 中所建议的那样.

遗憾的是,我不熟悉 Jaikoz .你可能会看看 Concepts: Editors and Renderers以及其他指导的后续部分。

附录:如您的评论所述,DefaultCellEditor 中的 JTextField 默认允许在选定字段中键入。从您的示例中不清楚该默认值是如何被取消的。缺少 sscce这说明了问题,您可以将您的代码与此相关的 example 进行比较使用 JTextField 的子类展示默认行为。

关于java - 将 JPanel 用作 JTable 单元格编辑器时出现焦点问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3986074/

相关文章:

java - 服务架构- webservies | SOAP

java - 通过 <s :url/> Struts2 tag 传递多个参数

java - 无法在 scala 中使用 jackson fastxml 将 json 数组反序列化为类对象

java - 更新自定义 ScrollBar UI 的颜色

java - NetBeans JForm源代码中的成员需要永远加载

java - 在小程序上画一个旋转的矩形

java - JScrollPane 没有将值更改为 ListEvents

java - 自定义 TableModel 中的 NullPointerException

java - 禁用 JTable 上的弹出菜单

java - 按 T​​AB 键填充 JTable