Java Swing |扩展AbstractTableModel并将其与JTable一起使用|几个问题

Java Swing |扩展AbstractTableModel并将其与JTable一起使用|几个问题,java,swing,jtable,abstracttablemodel,Java,Swing,Jtable,Abstracttablemodel,我遵循Oracle的模型来实现AbstractTableModel 我这样做是因为我的表必须包含3列,第一列必须是JCheckBox 这是我的密码: public class FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel extends AbstractTableModel { private String[] columnNames = {"Auswahl",

我遵循Oracle的模型来实现AbstractTableModel

我这样做是因为我的表必须包含3列,第一列必须是JCheckBox

这是我的密码:

public class FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel extends AbstractTableModel {
private String[] columnNames = {"Auswahl",
                                    "Dateiname",
                                    "Pfad"};
    private Object[][] data = {
    {new Boolean(true), "datei.tmp",
     "/home/user/tmp"}
    };

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

    public int getRowCount() {
        return data.length;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

    public Object getValueAt(int row, int col) {
        return data[row][col];
    }

    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }

     public boolean isCellEditable(int row, int col) {
        if (col == 0) {
            return true;
        } else {
            return false;
        }
    }

     public void setValueAt(Object value, int row, int col) {            
        data[row][col] = value;
        fireTableCellUpdated(row, col);
    }
}

以下是我的问题:

  • JTable(
    新JTable(FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel)
    )如何知道列名及其值?因为我的AbstractTableModel中没有构造函数?!是因为列名和数据必须按原样命名,JTable才能访问它们吗
  • 如何在JTable中添加新值?因为列名和数据是数组。我可以用向量替换它们吗?如果是,我如何初始化这些向量?在myAbsTableModel的构造函数中

  • 我认为很容易找到解决方案,但这个表格处理对我来说并不琐碎,所以非常感谢你

    首先,我认为您需要更多地了解Java,特别是继承(我指的是您的构造函数问题)

    回答你的问题:

    • 假设列名不变,通过
      private final static
      属性定义列名
    • 由于您的类扩展了
      AbstractTableModel
      ,因此您可以为它定义一个构造函数,在其中传递数据。请重新定义
      getValueAt
      方法,以允许模型使用您传递的数据
    还有一些建议:

    • 不要执行在
      getColumnClass
      中执行的操作。通常,列中的所有元素都具有相同的类,因此在列索引上执行
      开关以获取类
    • 要在其中一列中添加
      JCheckBox
      ,必须使用自定义
      TableCellRenderer
  • JTable通过在列模型上调用getColumnCount()来确定有多少列。然后它对每一列进行迭代并调用getColumnName(idx)。您的类告诉它列名——看看这些方法的实现

  • 您可以以任何格式存储数据。JTable调用表模型上的方法来检索该数据。如果要向模型中添加新项,可以向模型中实现addItem(Object o)方法;只需确保为每个新项调用fireTableRowsInserted()


  • 所有Swing组件都带有默认的模型实现。我建议您在尝试创建自己的组件之前先了解如何使用它们。对于一个名为DefaultTableModel的JTable,请阅读API以了解动态添加/删除模型中数据行的方法。以下是一个简单的示例:

    import java.awt.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    
    public class TableBasic extends JPanel
    {
        public TableBasic()
        {
            String[] columnNames = {"Date", "String", "Integer", "Boolean"};
    
            Object[][] data =
            {
                {new Date(), "A", new Double(1), Boolean.TRUE },
                {new Date(), "B", new Double(2), Boolean.FALSE},
                {new Date(), "C", new Double(9), Boolean.TRUE },
                {new Date(), "D", new Double(4), Boolean.FALSE}
            };
    
            JTable table = new JTable(data, columnNames)
            {
                //  Returning the Class of each column will allow different
                //  renderers and editors to be used based on Class
    
                public Class getColumnClass(int column)
                {
                    for (int row = 0; row < getRowCount(); row++)
                    {
                        Object o = getValueAt(row, column);
    
                        if (o != null)
                            return o.getClass();
                    }
    
                    return Object.class;
                }
            };
            table.setPreferredScrollableViewportSize(table.getPreferredSize());
            JScrollPane scrollPane = new JScrollPane( table );
            add( scrollPane );
        }
    
        private static void createAndShowUI()
        {
            JFrame frame = new JFrame("TableBasic");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add( new TableBasic() );
            frame.pack();
            frame.setLocationRelativeTo( null );
            frame.setVisible( true );
        }
    
        public static void main(String[] args)
        {
            EventQueue.invokeLater(new Runnable()
            {
                public void run()
                {
                    createAndShowUI();
                }
            });
        }
    }
    
    import java.awt.*;
    导入java.util.*;
    导入javax.swing.*;
    导入javax.swing.table.*;
    公共类TableBasic扩展了JPanel
    {
    公共表格基础()
    {
    String[]columnNames={“日期”、“字符串”、“整数”、“布尔值”};
    对象[][]数据=
    {
    {new Date(),“A”,新的双精度(1),Boolean.TRUE},
    {new Date(),“B”,新的双精度(2),Boolean.FALSE},
    {new Date(),“C”,新的双精度(9),Boolean.TRUE},
    {new Date(),“D”,新的双精度(4),Boolean.FALSE}
    };
    JTable table=新的JTable(数据、列名)
    {
    //返回每个列的类将允许不同的
    //基于类使用的渲染器和编辑器
    公共类getColumnClass(int列)
    {
    对于(int row=0;row
    我从未见过一个名称如此之长的类,你不能将“FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel”重命名为更有意义的名称吗?)类名是个笑话,不是吗?如果您继续使用这样的名称,很快您将需要一个“Festplattenreiniger”(硬盘驱动器清理器);-)谢谢你的回答,如果我能给你减一,我会这么做的。幽默感发生了什么?(是的,我只是编出来的)您不需要为自定义渲染器编写代码来显示复选框。JTable提供了一个默认的复选框渲染器和编辑器。您所需要做的就是重写getColumnClass()方法,为列返回布尔值,然后将使用适当的渲染器。