当前位置: 首页 > 知识库问答 >
问题:

Java Swing:自定义单元格编辑器不返回最新值

郁博学
2023-03-14

我已经创建了一个自定义单元编辑器,它附加到我的一个JTable列上。编辑器有一个JComboBox或一个JTextField作为组件。但是,当我手动编辑组合框的值并按下“tab”键时,新的(最近的)值不会附加到JTable单元格。相反,旧值被替换。(我已经用另一个代码模板实现了“tab”行为,但这通常是有效的,因为所有其他表格单元格都已正确更新)

导致问题的组合框设置在“案例C”中。如果用户现在选择ITEM“无限”,该值将成功附加到JTable。但是,如果用户在JTable中手动输入值并按“选项卡”,新值将被丢弃,旧值将在表中再次呈现。但是,作为热修复补丁,如果用户在组合框中输入值,在紧接着点击“ENTER”和THEN选项卡,该值将正确地通过jtable写入!

我的自定义单元格编辑器实现如下所示:

public class CustomCellEditor extends AbstractCellEditor implements TableCellEditor {

    JFrame mParent                  = null;
    JFrame mPopup                   = null;
    String className                = "";

    protected int clickCountToStart = 2;

    private TableCellEditor mEditor = null;
    private JComboBox mComboBox     = null;

    public CustomCellEditor(JFrame parent, String className, JComboBox comboBox) {
        mParent             = parent;
        mClassName          = className;
        mComboBox           = comboBox;
    }

    @Override
    public Component getTableCellEditorComponent(final JTable table, final Object value, final boolean isSelected, final int row, final int column) {

        if ( className.equals("case A") ) {

            mComboBox.setModel( new DefaultComboBoxModel(Constants.YES_NO_ARRAY) );
            mComboBox.setEditable(false);
            mEditor = new DefaultCellEditor(mComboBox);
        }
        else if ( className.equals("case B") ) {

            mComboBox.setModel( new DefaultComboBoxModel(Constants.LANG_ARRAY) );
            mComboBox.setEditable(false);
            mEditor = new DefaultCellEditor(mComboBox);
        }
        else if ( className.equals("case C") ) {

            // THIS is the case, when the Jcombobox become editable, so beside the pre-defined item "Constants.INFIINITY" any arbitrary input should be allowed!
            mComboBox.setModel ( new DefaultComboBoxModel(new String[]{Constants.INFINITY}) ) ;
            mComboBox.setEditable(true);
            mEditor = new DefaultCellEditor(mComboBox);
        }
        else {
            mEditor = new DefaultCellEditor(new JTextField());
        }

        return mEditor.getTableCellEditorComponent(table, value, isSelected, row, column);
    }

    /**
    * Returns true if <code>anEvent</code> is <b>not</b> a
    * <code>MouseEvent</code>.  Otherwise, it returns true
    * if the necessary number of clicks have occurred, and
    * returns false otherwise.
    *
    * @param   anEvent         the event
    * @return  true  if cell is ready for editing, false otherwise
    * @see #setClickCountToStart
    * @see #shouldSelectCell
    */
    @Override
    public boolean isCellEditable(EventObject anEvent) {
        if (anEvent instanceof MouseEvent) {
            return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
        }
        return true;
    }

    @Override
    public Object getCellEditorValue() {
        if (mEditor != null) {

            return mEditor.getCellEditorValue();
        }
        return null;
    }

}

有人知道原因是什么吗?在“案例C”的情况下,我没有得到最大的原因值,而是上一个表的值?

谢谢你

共有2个答案

秦禄
2023-03-14

你试过这个吗?

table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
袁恩
2023-03-14

下面是一个示例,允许您在不创建自定义编辑器的情况下使用不同的编辑器。它覆盖了JTable的getCellEditor(...)方法:

import java.awt.*;
import java.util.List;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.table.*;

public class TableComboBoxByRow extends JPanel
{
    List<String[]> editorData = new ArrayList<String[]>(3);

    public TableComboBoxByRow()
    {
        setLayout( new BorderLayout() );

        // Create the editorData to be used for each row

        editorData.add( new String[]{ "Red", "Blue", "Green" } );
        editorData.add( new String[]{ "Circle", "Square", "Triangle" } );
        editorData.add( new String[]{ "Apple", "Orange", "Banana" } );

        //  Create the table with default data

        Object[][] data =
        {
            {"Color", "Red"},
            {"Shape", "Square"},
            {"Fruit", "Banana"},
            {"Plain", "Text"}
        };
        String[] columnNames = {"Type","Value"};

        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        JTable table = new JTable(model)
        {
            //  Determine editor to be used by row
            public TableCellEditor getCellEditor(int row, int column)
            {
                int modelColumn = convertColumnIndexToModel( column );

                if (modelColumn == 1 && row < 3)
                {
                    JComboBox<String> comboBox1 = new JComboBox<String>( editorData.get(row));
                    return new DefaultCellEditor( comboBox1 );
                }
                else
                    return super.getCellEditor(row, column);
            }
        };

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );

    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Table Combo Box by Row");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new TableComboBoxByRow() );
        frame.setSize(200, 200);
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

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

您的逻辑会有所不同,因为您是基于单元格中的数据类来编写编辑器的,但基本概念可能是相同的。

 类似资料:
  • 我创建了一个带有自定义表格呈现和自定义单元格编辑器的JTable,它在图像中给出结果 我使用一个扩展JPanel的单独类创建了第一个表格单元格中显示的面板。并将表值添加为, 这是我的表格自定义类来创建这个表格, 我的问题是认为面板如我预期的那样显示,我不能在文本字段中键入或更改复选框或单击按钮。请告诉我如何解决这个问题。

  • 我有一个JTable,其中添加了一个JButton(Delete button)和一个JComboBox作为两列上的自定义单元格编辑器。现在,当我在组合框中选择一个项目并单击Delete按钮时,所选行被删除,但已删除行的组合框在该行上呈现。我是否也必须从表中删除单元编辑器。如果我不选择我的组合框,代码就可以正常工作。请帮帮我。 我的代码是这样的:- 我在main中实例化了我的类的一个对象,然后单击

  • 我被卡住了使用KendoUI网格。到目前为止,该设置按预期工作。我创建了一个有5个条目的自定义数据源,所有条目都包含标题、描述和值。值可以不同,它们可以是:布尔值、数字值、文本值、日期值或时间值。 使用自定义KendoTemboard的编辑弹出窗口,我可以得到弹出窗口显示正确的字段类型根据值是什么: 到目前为止,一切都很好,一切正常。日期选择器 但是(!)有一件事出错了。与我尝试的不同,编辑表单发

  • 我有一个带有单元格编辑的primefaces datatable,它可以在视图中的一个布尔变量上切换。 我有三个问题: 在编辑模式下,我更改了一个值,然后单击页面上的“保存”按钮,它不会保留新值,如果我先单击页面上的任何其他位置,然后单击“保存”,它将保留该值。如果您先单击“保存”,我需要它来保留值。 如果我编辑了一个输入文本的单元格,然后我单击了它,那么该字段现在就是一个输出文本,直到我再次单击

  • 问题内容: 我需要在jTable中显示数字,精确到小数点后两位。为此,我创建了一个自定义单元格编辑器,如下所示: 该单元格编辑器非常适合将点用作小数点的英语语言环境。但是在德语语言环境中,它不接受逗号作为小数点的值。请让我知道我的代码中有问题的地方。提前致谢。 编辑:这是我如何使其工作: 问题答案: 使用语言环境来发挥您的优势:

  • 我在这个JTable上有问题。我这样编辑单元格 然后,我按Enter键提交更改。在这里,我希望gui用新的值刷新表。 但它们不显示,只有当我像这样更改选择时它们才显示 这是在TableModel中调用的。