-1

我遵循 Oracle 的模型来实现 AbstractTableModel

http://download.oracle.com/javase/tutorial/uiswing/examples/components/TableDemoProject/src/components/TableDemo.java

我这样做是因为我的表必须包含 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);
    }

}

以下是我的问题:

  1. JTable ( ) 如何new JTable(FestplattenreinigerGraphicalUserInterfaceHomePagePanelTableModel)知道列名和它们的值是什么?因为我的 AbstractTableModel 中没有构造函数?!是否因为 columnNames 和 data 必须像它们一样命名并且 JTable 访问它们?
  2. 如何在我的 JTable 中添加新值?由于 columnNames 和 data 是数组。我可以用向量替换它们吗?如果是这样,我该如何初始化这些向量?在 myAbsTableModel 的构造函数中?

我认为很容易找到解决方案,但是这个表格处理对我来说并不是微不足道的,所以非常感谢你!

4

3 回答 3

2

所有 Swing 组件都带有默认模型实现。我建议您在尝试创建自己的之前先了解如何使用它们。对于 JTable,它称为 DefaultTableModel。阅读 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();
            }
        });
    }
}
于 2010-11-29T16:36:20.887 回答
0
  1. JTable 通过在列模型上调用 getColumnCount() 来确定有多少列。然后它为每一列迭代并调用 getColumnName(idx)。你的类告诉它列名——看看你对这些方法的实现。

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

于 2010-11-29T12:44:23.443 回答
0

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

回答您的问题:

  • private final static假设您的列名没有更改,则通过属性定义您的列名。
  • 由于您的类 extends AbstractTableModel,您可以为它定义一个构造函数,您将在其中传递数据。重新定义getValueAt方法以允许模型使用您传递的数据。

更多建议:

  • 不要做你正在做的事情getColumnClass。通常,列中的所有元素都将具有相同的类,因此switch对列索引执行 a 以获取类。
  • 要在您的列中添加一个JCheckBox,您必须使用自定义TableCellRenderer
于 2010-11-29T12:42:16.477 回答