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

编辑JTable列将数据放入错误的列中当列重新排列时

丁韬
2023-03-14

我试图创建一个“简单”的JTable,它使用一个TableModel来扩展AbstractTableModel绑定到一个ArrayList。我的目标是保留允许单元格编辑、行排序和列重排的所有内置JTable功能。我在这里提供的示例完成了所有这些...但是...在一定的操作序列下,当编辑单元格然后通过拖动列标题重新排列表列时,或者使用列标题按钮排序表时,最近编辑的单元格的内容被复制到表行的两列中。

我可以将问题重现如下:运行示例。双击或按F2编辑左上方单元格的内容,然后按Enter。将左侧的列标题向右拖动到其相对位置。行的两个单元格的值将更改为与所选单元格匹配。同样,编辑左上角的单元格并按Enter键。然后单击任一列标题对表进行排序。排序按要求完成,但刚刚编辑的单元格的内容被复制到该行的另一列中。如果按TAB或ESC终止编辑,则行为略有不同。但问题仍然发生在“正确”的行动序列下。

包表示例;

import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;


public final class TableExample extends JFrame {

        public List<REItem> REList;
        public JTable tblREList;


    public TableExample() {

        REList = new ArrayList<>();
        REList.add(new REItem("Template1", "Comment1"));
        REList.add(new REItem("Template2", "Comment2"));
        RETableModel retm = new RETableModel(REList);
        tblREList = new JTable(retm); 
        tblREList.setAutoCreateRowSorter(true);
        JScrollPane spREList = new JScrollPane(tblREList);
        this.add(spREList); //add the table to the frame
        this.setTitle("Table Example");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
        this.pack();
        this.setVisible(true);

    } // end TableExample constructor


    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            TableExample notUsed = new TableExample();
        });
    } //end main


    /**
     *      One item for the RETable
     */
    public final class REItem {
        String template;
        String comment;

        public REItem(String tmp, String cmt) {
            this.template = tmp;
            this.comment = cmt;
        }

        public String getTemplate() { return template; }

        public String getComment() { return comment; }

        public void setTemplate(String value) { this.template = value; }

        public void setComment(String value) { this.comment = value; }

    } // end class REItem


    public class RETableModel extends AbstractTableModel {

        private List<REItem> reList = new ArrayList();
        private final String[] columnNames = { "Template", "Comment" };

        public RETableModel(List<REItem> list){
             this.reList = list;
        }

        @Override
        public String getColumnName(int column){
             return columnNames[column];
        }

        @Override     
        public int getRowCount() {
            return reList.size();
        }

        @Override        
        public int getColumnCount() {
            return columnNames.length; 
        }

        @Override
        public Object getValueAt(int rowIndex, int column) {
            REItem rei = reList.get(rowIndex);
            switch (column) {
                case 0: 
                    return rei.getTemplate();
                case 1:
                    return rei.getComment();
               }
               return null; // default case
       }

        @Override
        public boolean isCellEditable(int row, int column) {
            return true;
        }

       @Override
       public Class<?> getColumnClass(int column){
            switch (column){
                case 0:
                  return String.class;
                case 1:
                  return String.class;
            }
            return null; // default case
        }

     @Override
     public void setValueAt(Object value, int row, int column) {
            REItem rei = reList.get(row);
            switch (column) {
                case 0: 
                    rei.setTemplate(value.toString());
                case 1:
                    rei.setComment(value.toString());
               }
            // uncommenting the below often causes IndexOutOfBoundsException: Invalid range exception
            fireTableCellUpdated(row, column); 
     } // end setValueAt

    } // end RETableModel    

} // end class TableExample

共有1个答案

党浩阔
2023-03-14

switch语句执行匹配大小写后面的所有语句。这意味着,一旦满足条件,开关块中的所有代码都将被执行。可以通过在每个大小写中添加break;来避免这种情况。在您的示例中,当您设置模板时,也设置了注释。

switch (column) {
    case 0:
        rei.setTemplate(value.toString());
        break;
    case 1:
        rei.setComment(value.toString());
        break;
   }
 类似资料:
  • 问题内容: 我正在为我的JTable列使用以下代码进行编辑/取消编辑,但是当用户重新排列列时,以下代码不起作用,代码的SSCCE如下: 问题答案: 请注意,模型索引和视图索引 不 相等。如前所述这里, 提供了从模型坐标转换为视图坐标- 和-的方法,以及从视图坐标转换为模型坐标- 和的方法。 本教程部分讨论了 对 行进行 排序和过滤 ,但是原理也适用于列。没有完整的示例,很难确定。

  • 问题内容: 我在python / pyspark中有一个带有列的数据框 ,依此类推...... 现在,我在此数据框中添加了新列。 现在,我必须安排这样的列的列来后 我已经完成如下 我收到此错误 为什么会发生此错误。我该如何纠正。 问题答案: 您可以用来更改列的顺序:

  • 问题内容: 有没有办法将numpy 2D数组中的列顺序更改为新的任意顺序?例如,我有一个数组 我想将其更改为 通过应用排列 在列上。因此,在新矩阵中,我希望将原始文档的第一列保留在原位置,将第二列移至最后一列,依此类推。 有一个numpy函数可以做到吗?我有一个相当大的矩阵,并且希望得到更大的矩阵,因此我需要一个可以在可能的情况下快速且适当地执行此操作的解决方案(置换矩阵是不可行的) 谢谢。 问题

  • 问题内容: 我需要移动现有列的位置(以获得更好的可见性)。 如何做到这一点而又不影响数据? 问题答案: 修改也可以。看一看:

  • 我有一个超过200列的。问题在于订单生成时的状态 我需要按如下方式重新排列这些列: 在Python中有什么方法可以做到这一点吗?