【问题标题】:Taking data from Mysql to JTable in JAVAJAVA中从Mysql取数据到JTable
【发布时间】:2015-05-03 03:05:26
【问题描述】:

我正在尝试在我的 Jtable 中获取信息并从 mysql 读取信息,看起来时代来自这个细分市场,因为我可以看到卡住了,我不知道该怎么做,现在我有一个 DefaultTableModel 定义JTable 将使用的方法,我将覆盖 getColumnClass, 我希望我的代码从类中获取列。

static DefaultTableModel TableModel = new DefaultTableModel(dataInfo, columns){
     public Class getColumnClass(int column) {

           if ((column >= 0) && (column < getColumnCount())) {
                  returnValue = getValueAt(0, column);
     } else {


                  returnValue;
                }


            };

【问题讨论】:

  • “我希望我的代码从类中获取列” - 这不是一个非常糟糕的主意。如果列的行中的值为null,会发生什么情况?最好提前知道该列负责什么类型的值。仔细查看JDBC Database Access了解更多详情
  • 那我该怎么办?现在它不为空。我被卡住了:(
  • 假设您正在从数据库中加载数据,您应该使用 ResultSet 对象中的 ResultSetMetaData 来获取列类型并将该信息存储在表模型中,这样您就可以根据数据库中的信息返回正确的(预期的)类型
  • madprogrammer 让我也在那里阅读更多内容。

标签: java swing jdbc jtable defaulttablemodel


【解决方案1】:

如果我清楚地理解您,您需要添加 .getclass 方法,该方法有助于将变量移到左侧,并且您还必须返回类的值,在这种情况下将按如下方式完成。取每列的第一个条目。希望能帮助到你。假设您的列没有空值。

static DefaultTableModel TableModel = new DefaultTableModel(dataInfo, columns){
public Class getColumnClass(int column) {
Class returnValue;
// Verifying that the column exists (index > 0 && index < number of columns
if ((column >= 0) && (column < getColumnCount())) {
  returnValue = getValueAt(0, column).getClass();
    //you need to add the .getclass method which 
                  //gets the variable to the left.
 } else {
  // Returns the class for the item in the column   
 returnValue = Object.class;
                }
 return returnValue;
              }
            };

【讨论】:

  • getValueAt(0, column)null 时会发生什么?坦率地说,这不仅愚蠢,而且非常危险。更好的解决方案是现在每列的类类型是什么,而不依赖于表中的数据(数据应遵循列的约定)。根据我对 OP 试图做什么的“假设”,他们应该从ResultSetMetaData 中提取这些信息
  • @syombua 让我试试这个,实际上我知道我的错误在哪里。等我几秒钟回来告诉你它是否有效。
  • 现在我传递的参数没有空值了。嘿 syombua 这很好。我很感激。自变量现在起作用了。
【解决方案2】:

我们需要稍微修改TableModel,这样我们就可以控制Class列的类型...

public class MyTableModel extends DefaultTableModel {

    private List<Class> columnTypes;

    public MyTableModel() {
    }

    public MyTableModel(int rowCount, int columnCount) {
        super(rowCount, columnCount);
    }

    public MyTableModel(Vector columnNames, int rowCount) {
        super(columnNames, rowCount);
    }

    public MyTableModel(Object[] columnNames, int rowCount) {
        super(columnNames, rowCount);
    }

    public MyTableModel(Vector data, Vector columnNames) {
        super(data, columnNames);
    }

    public MyTableModel(Object[][] data, Object[] columnNames) {
        super(data, columnNames);
    }

    public MyTableModel(List<Class> columnTypes) {
        this.columnTypes = columnTypes;
    }

    public MyTableModel(List<Class> columnTypes, Object[] columnNames, int rowCount) {
        super(columnNames, rowCount);
        this.columnTypes = columnTypes;
    }

    public MyTableModel(List<Class> columnTypes, Object[][] data, Object[] columnNames) {
        super(data, columnNames);
        this.columnTypes = columnTypes;
    }

    public MyTableModel(List<Class> columnTypes, Vector data, Vector columnNames) {
        super(data, columnNames);
        this.columnTypes = columnTypes;
    }

    public MyTableModel(List<Class> columnTypes, Vector columnNames, int rowCount) {
        super(columnNames, rowCount);
        this.columnTypes = columnTypes;
    }

    public MyTableModel(List<Class> columnTypes, int rowCount, int columnCount) {
        super(rowCount, columnCount);
        this.columnTypes = columnTypes;
    }

    public void setColumnTypes(List<Class> columnTypes) {
        this.columnTypes = columnTypes;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        return columnTypes.get(columnIndex);
    }

}

然后,我们从数据库中加载数据,您可以使用ResultSet中的ResultSetMetaData来确定该列代表的最合适的对象类型(基于ResultSet#getObject的返回结果)

MyTableModel tableModel = new MyTableModel();
try (ResultSet rs = ...) {
    ResultSetMetaData rsmd = rs.getMetaData();
    List<Class> columnTypes = new ArrayList<Class>(rsmd.getColumnCount());
    for (int column = 0; column < rsmd.getColumnCount(); column++) {
        String className = rsmd.getColumnClassName(column + 1);
        try {
            columnTypes.add(Class.forName(className));
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
            columnTypes.add(Object.class);                  
        }
    }
    tableModel.setColumnTypes(columnTypes);

    // Load data from the ResultSet
} catch (SQLException exp) {
    exp.printStackTrace();
}

更多详情请见JDBC Database Access...

【讨论】:

  • 非常复杂。我很快就会到那里。
猜你喜欢
  • 2014-09-17
  • 1970-01-01
  • 2012-06-27
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 2017-07-27
  • 2015-06-17
相关资源
最近更新 更多