【问题标题】:Unable to edit seemingly arbitrary JTable columns无法编辑看似任意的 JTable 列
【发布时间】:2010-09-02 20:28:41
【问题描述】:

正如标题所述,我有一个JTable,但我无法编辑“任意”列。我有 4 列,只有第一列是可编辑的。第一列有文件和一个特殊的编辑器,接下来的两列有字符串,最后一列有整数。我正在使用自定义模型,并且从 isCellEditable 方法返回 true。当然,我首先咨询了几个网站寻求帮助,但我找不到任何有帮助的东西。我使用 java 源代码覆盖了几个 JTable 方法并插入打印语句。特别是,我发现 table.editCellAt(row, col) 总是返回 false,因为从单元格编辑器返回的编辑组件总是为 null。所以,我自然而然地尝试使用table.setDefaultEditor(String.class, new MyEditor()) 替换编辑器。奇怪的是,这没有工作。 String 列的所有编辑器仍然是 JTable 默认使用的 GenericEditor。然后我尝试通过执行以下操作将编辑器添加到每一列:

TableColumnModel model = table.getColumnModel();
for(int i = 1; i < model.getColumnCount(); i++){
    model.getColumn(i).setCellEditor(new MyEditor());
}

请注意,i 从 1 开始,因为第一列已经有一个合适的编辑器。在这一点上我没有想法,所以我向 Stack Overflow 的好人寻求帮助。

编辑:我正在使用DefaultTableModel,我只是覆盖了isCellEditable 以确保它始终返回true(即使DefaultTableModel 应该默认这样做)。我这样做是为了减少无用、浪费的调试响应的数量。此外,一列可编辑但其他列不可编辑的事实似乎表明问题出在其他地方。

编辑:看来问题在于列创建。一位教授建议更改setAutoCreateColumnsFromModel,它似乎已经解决了这个问题。

【问题讨论】:

  • 您有自定义代码但它不起作用?那么这就是我要开始的地方。首先使用 JDK 附带的类使代码工作。为此使用 DefaultTableModel。然后,一旦您证明它有效,您就可以使用自定义代码一次进行一项更改。当它停止工作时,您就知道问题出在哪里,您可以发布您的 SSCCE (sscce.org) 来显示问题。
  • @gerenba:我将您的附加信息迁移到了问题中。如果不正确,请恢复。
  • Swing 教程中有一个使用 DefaultTableModel 的简单示例,这可能是一个很好的 SSCCE 基础。 download.oracle.com/javase/tutorial/uiswing/components/…
  • 距离您上次编辑已超过 5 小时,SSCCE 在哪里?这样做没有技巧,所以你一定是在做一些奇怪的事情。下面发布的 SSCCE 的简单示例。

标签: java swing editor jtable


【解决方案1】:

只需 5 行“自定义代码”即可测试 JTable 的使用情况。其余代码是您将来可能创建的任何 SSCCE 的模板。

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
        DefaultTableModel model = new DefaultTableModel(5, 3);
        JTable table = new JTable( model );
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("Basic SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new SSCCE() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

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

【讨论】:

    【解决方案2】:

    我使用的是 DefaultTableModel,我只是覆盖了 isCellEditable 以确保它始终返回 true(即使 DefaultTableModel 应该默认这样做)。我这样做是为了减少无用、浪费的调试响应的数量。此外,一列可编辑但其他列不可编辑的事实似乎表明问题出在其他地方。

    【讨论】:

    • @Brett Geren,@gerenba:我已将您的附加信息迁移到问题中,因此您可以将其删除。请在网站上使用单一身份。
    【解决方案3】:

    看来问题在于列的创建。一位教授建议更改setAutoCreateColumnsFromModel,它似乎已经解决了这个问题。

    【讨论】:

    • @Brett Geren,@gerenba:我已将您的附加信息迁移到问题中,因此您可以将其删除。请在网站上使用单一身份。
    • 是的,我们怎么可能猜到你正在使用这种方法,因为 Swing 教程中的示例都没有使用这种方法。这就是为什么您应该针对每个问题发布 SSCCE。
    猜你喜欢
    • 1970-01-01
    • 2013-04-17
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多