【问题标题】:Populating JTable with details from two database tables JDBC使用来自两个数据库表 JDBC 的详细信息填充 JTable
【发布时间】:2016-03-21 14:32:18
【问题描述】:

我在此处查看了一些视频和问题,但找不到我要查找的内容。我是一个编程菜鸟(使用 Derby 数据库在 Netbeans 上用 Java 编程)所以请温柔一点。我有一个数据库,里面有 2 个表。 StudentScores 和 StudentDetails。

StudentDetails 包含 NAMEID 和 STUDENTNAME 列。

StudentScores 包含 NAMEID、SCOREID、DATETAKEN 和 SCORE 列。

我想在我的程序中有一个 JTable,它显示第一个数据库中的 NAME 列以及第二个表中的 DATATAKEN 和 SCORE。 我该怎么做? 我只找到了有关如何使用一个数据库表中的所有详细信息填充 JTable 的教程。

我还希望用户能够在组合框中选择学生的姓名时查看学生的所有记录(在 JTable 中)。我知道我必须在组合框中获取名称的 ID 并查询?

我发现了这个 http://1bestcsharp.blogspot.co.uk/2015/06/java-mysql-populate-jtable-Depending-JCombobox-Selected-Value.html

但我很困惑,因为正在创建多个类。 我必须创建多个类还是可以在同一个 JFrame 表单中全部完成?

【问题讨论】:

  • 如果您的数据库可以在两个表之间执行连接(请阅读其他地方的连接),那么您的 Java 程序可以将连接的结果视为一张表。这会让你度过难关吗?
  • 您好,感谢您的回复。我查看了连接,并且内部连接了我想要的两个表中的列,这现在是一个新表吗?它没有出现在Services中数据库下的“Tables”部分,在查询等时如何在主程序中引用它? @OleV.V.
  • 不,这不是一个新表。但是您将数据从 ResultSet 获取到 TableModel 的代码并不关心 ResultSet 中的数据是如何填充的,只关心数据是否存在。所以你的问题是 SQL 问题而不是 Swing 问题。
  • 好的,我有一些工作,但它没有显示任何数据,只是列标题。我还注意到,当我查看 StudentScores 表中的数据时,NAMEID 表示每个条目的 并且所有记录都是相同的。你认为这是问题所在吗?我该如何解决? @camickr
  • 我认为nameid应该对每条记录都有一个唯一的值,否则你如何唯一标识每个人?

标签: java database swing jdbc netbeans


【解决方案1】:

试试这个:

import java.awt.Dimension;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;

public class Main extends JFrame {
  private JTable m_simpleTable;

  private SimpleTableModel m_simpleTableModel;

  public Main() {

    m_simpleTableModel = new SimpleTableModel(getData());
    m_simpleTable = new JTable(m_simpleTableModel);
    JScrollPane scrollPane = new JScrollPane(m_simpleTable);
    getContentPane().add(scrollPane);
  }

  public Vector getData(){
      Vector dummyMacData = new Vector(10, 10);
        dummyMacData.addElement(new Data(new Integer(100), "ABC", "11/12/2016","A+", "E"));
        dummyMacData.addElement(new Data(new Integer(105), "XYZ", "20/01/2015","B-", "E"));
        return dummyMacData;
  }

  public static void main(String[] arg) {
    Main m = new Main();

    m.setVisible(true);
    m.setSize(new Dimension(600, 300));
    m.validate();
  }

  class SimpleTableModel extends AbstractTableModel {
    public String[] m_colNames = { "Student Id", "Name", "Date","Score", "" };

    public Class[] m_colTypes = { Integer.class, String.class, String.class, String.class,
        String.class };

    Vector m_macDataVector;

    public SimpleTableModel(Vector macDataVector) {
      super();
      m_macDataVector = macDataVector;
    }
    public int getColumnCount() {
      return m_colNames.length;
    }
    public int getRowCount() {
      return m_macDataVector.size();
    }
    public void setValueAt(Object value, int row, int col) {
      Data macData = (Data) (m_macDataVector.elementAt(row));

      switch (col) {
      case 0:
        macData.setStudentId((Integer) value);
        break;
      case 1:
        macData.setName((String) value);
        break;
      case 2:
        macData.setDate((String) value);
        break;
      case 3:
        macData.setScore((String) value);
        break;
      case 4:
        //macData.setE((String) value);
        break;
      }
    }

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

    public Class getColumnClass(int col) {
      return m_colTypes[col];
    }
    public Object getValueAt(int row, int col) {
      Data macData = (Data) (m_macDataVector.elementAt(row));

      switch (col) {
      case 0:
        return macData.getStudentId();
      case 1:
        return macData.getName();
      case 2:
        return macData.getDate();
      case 3:
        return macData.getScore();
      case 4:
        return null;//macData.getE();
      }

      return new String();
    }
  }

}

class Data {
  private Integer studentId;

  private String name;

  private String date;

  private String score;

  private String e;

  public Data() {
  }

  public Data(Integer aa, String bb, String cc, String dd, String ee) {
      studentId = aa;
      name = bb;
      date = cc;
      score = dd;
    e = ee;
  }

public Integer getStudentId() {
    return studentId;
}

public void setStudentId(Integer studentId) {
    this.studentId = studentId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getScore() {
    return score;
}

public void setScore(String score) {
    this.score = score;
}



}

【讨论】:

  • 嘿,感谢您的回复,这在主 JFrame 中对吗?因为我得到的只是 SimpleTableModel 的错误,说它已经定义了
  • @z33 检查已创建的对象。错误本身有足够的信息。
【解决方案2】:

请在下面的链接中查看我的答案。几乎和你的问题一样。希望这会有所帮助。

How to bring all data of table in JTable and insert it into Database

【讨论】:

    【解决方案3】:

    只要这样做..它应该可以正常工作

    Select 
      sd.NameID,
      sd.StudentsName,
      sm.DATETAKEN,
      sm.Score 
    from 
      (firsttablename) sd,
      (secondtablename) sm 
    where 
      sd.NameId = sm.NameId 
      and sd.NameID = (nameid you want to display data)
    

    但在此您必须将 nameid 作为第二个表中的外键。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多