Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用OOP概念将arraylist对象设置为表_Java_Swing_Jdbc_Arraylist_Jtable - Fatal编程技术网

Java 如何使用OOP概念将arraylist对象设置为表

Java 如何使用OOP概念将arraylist对象设置为表,java,swing,jdbc,arraylist,jtable,Java,Swing,Jdbc,Arraylist,Jtable,我在从DB获取值的方法中创建了一个OrderModel对象,并将其设置为JTable。我想知道如何使用以下代码将创建的对象设置为JTable: tblOrderItems.setModel(DbUtils.resultSetToTableModel()); 这是我的代码: private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt) {

我在从DB获取值的方法中创建了一个
OrderModel
对象,并将其设置为
JTable
。我想知道如何使用以下代码将创建的对象设置为
JTable

 tblOrderItems.setModel(DbUtils.resultSetToTableModel());
这是我的代码:

private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt) {                                          
      int raw = tblOrderList.getSelectedRow();
      OrderModel or;
      String item;
      Double qty,amount,total;

      ArrayList<OrderModel> arrOrder = new ArrayList<OrderModel>();

      String selectedRaw = tblOrderList.getModel().getValueAt(raw, 0).toString();
      String sql = "select item,qty,amount from orderdetails where orderid='"+selectedRaw+"'";
      con = new DBconnector().connect();
        try {
            ps = con.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            if(rs.next()){
                or = new OrderModel();
                or.setItem(rs.getString("item"));
                or.setQty(rs.getDouble("qty"));
                or.setAmount(rs.getDouble("amount"));
                arrOrder.add(or);

            DefaultTableModel tblModel = new DefaultTableModel();
          // wanted to set ArrayList to table+              
            tblOrderItems.setModel(DbUtils.resultSetToTableModel());

            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }                           
private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt){
int raw=tblOrderList.getSelectedRow();
订单模型或;
字符串项;
双倍数量、金额、总额;
ArrayList Arroder=新的ArrayList();
字符串selectedRaw=tblOrderList.getModel().getValueAt(原始,0.toString();
String sql=“从orderdetails中选择项目、数量、金额,其中orderid=”+selectedRaw+”;
con=新的DBconnector().connect();
试一试{
ps=con.prepareStatement(sql);
结果集rs=ps.executeQuery();
如果(rs.next()){
或=新的OrderModel();
或.setItem(rs.getString(“item”));
或.设置数量(rs.getDouble(“数量”);
或.设定金额(rs.getDouble(“金额”));
加上(或);
DefaultTableModel tblModel=新的DefaultTableModel();
//想要将ArrayList设置为table+
tblOrderItems.setModel(DbUtils.resultsetTableModel());
}
}捕获(例外e){
e、 printStackTrace();
}
}                           

首先创建您自己的
TableModel
,它可以管理您的
OrderModel
类,它表示表中的一行

public static class OrderTableModel extends AbstractTableModel {

    protected static final String[] COLUMN_NAMES = {"Item", "Qty", "Amount"};
    private List<OrderModel> rows;

    public OrderTableModel(List<OrderModel> rows) {
        this.rows = new ArrayList<>(rows);
    }

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

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

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Object value = null;
        OrderModel row = rows.get(rowIndex);
        switch (columnIndex) {
            case 0:
                value = row.getItem();
                break;
            case 1:
                value = row.getQty();
                break;
            case 2:
                value = row.getAmount();
                break;
        }
        return value;
    }

}
公共静态类OrderTableModel扩展了AbstractTableModel{
受保护的静态最终字符串[]列名称={“项目”、“数量”、“金额”};
私有列表行;
public OrderTableModel(列表行){
this.rows=新的ArrayList(行);
}
@凌驾
public int getRowCount(){
返回rows.size();
}
@凌驾
public int getColumnCount(){
返回列_NAMES.length;
}
@凌驾
公共字符串getColumnName(int列){
返回列名称[列];
}
@凌驾
公共对象getValueAt(int行索引、int列索引){
对象值=空;
OrderModel行=rows.get(rowIndex);
开关(列索引){
案例0:
value=row.getItem();
打破
案例1:
value=row.getQty();
打破
案例2:
value=row.getAmount();
打破
}
返回值;
}
}
然后你可以使用像

private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt) {
    int raw = tblOrderList.getSelectedRow();
    OrderModel or;
    String item;
    Double qty, amount, total;

    ArrayList<OrderModel> arrOrder = new ArrayList<OrderModel>();

    String selectedRaw = tblOrderList.getModel().getValueAt(raw, 0).toString();
    String sql = "select item,qty,amount from orderdetails where orderid=?";
    con = new DBconnector().connect();
    try (PreparedStatement ps = con.prepareStatement(sql)) {
        ps.setString(1, selectedRaw);
        try (ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                or = new OrderModel();
                or.setItem(rs.getString("item"));
                or.setQty(rs.getDouble("qty"));
                or.setAmount(rs.getDouble("amount"));
                arrOrder.add(or);
            }
            OrderTableModel model = new OrderTableModel(arrOrder);
            tblOrderItems.setModel(model);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }

}
private void tblOrderListMouseClicked(java.awt.event.MouseEvent evt){
int raw=tblOrderList.getSelectedRow();
订单模型或;
字符串项;
双倍数量、金额、总额;
ArrayList Arroder=新的ArrayList();
字符串selectedRaw=tblOrderList.getModel().getValueAt(原始,0.toString();
String sql=“从orderdetails中选择项目、数量、金额,其中orderid=?”;
con=新的DBconnector().connect();
try(PreparedStatement ps=con.preparest陈述(sql)){
ps.setString(1,选择的图纸);
try(ResultSet rs=ps.executeQuery()){
while(rs.next()){
或=新的OrderModel();
或.setItem(rs.getString(“item”));
或.设置数量(rs.getDouble(“数量”);
或.设定金额(rs.getDouble(“金额”));
加上(或);
}
OrderTableModel模型=新的OrderTableModel(Arroder);
tblOrderItems.setModel(model);
}
}捕获(SQLE异常){
e、 printStackTrace();
}
}
只需将项目加载到
ArrayList
中,然后将其传递到
OrderTableModel
的实例,然后应用到
JTable

了解有关使用自定义模型的更多详细信息

查看有关如何使用
PreparedStatement
s的更多详细信息


查看有关如何更好地管理数据库(和其他)资源的更多详细信息

使您的
OrderModel
扩展
AbstractTableModel
,并在
setModel
方法中使用
作为参数,因为每个
OrderModel
都是一行,您需要一个
TableModel
实现,它可以管理these@MadProgrammer这是正确的。您必须创建一个表模型类,然后将行添加到该表模型中,并将jtable的模型设置为此表模型I没有任何抽象类。我们不能用这个代码吗?什么是
DbUtils
?它是自定义类吗?如果是,那么发布方法的代码
resultsetottablemodel()
你知道关于rxj2xml.jar的任何事情吗?不,从我所看到的一切来看,这比它的价值更麻烦。基本上,它接受一个
ResultSet
并生成一个
TableModel
,您无法进一步控制它it@MadProgrammer我想答案不太好,然后有两个问题(我不希望答案是y)1.为什么要回答一个从未发布过SSCCE的OP问题2。a) int raw应该进行测试,如果grather大于-1,2 b。)鼠标点击(3-5个鼠标按钮的所有事件:-)非常脆弱(EDT v.s.从/到SQL解释器的性能),我会使用鼠标右键弹出的可运行线程(从SwingWorker处享受)进行JDBC@mKorbel不我当然不会在生产环境中将JDBC调用放在EDT中,这是真的。不可能为基于JDBC的问题提供一个可运行的示例,代码对他们试图做的事情给出了足够好的理解
MouseClicked
也不是一个很好的选择,同意,工具栏上的
JButton
或者
JMenuBar中的
JMenuItem
或者
jpopmpmenu
可能是一个更好的选择,但是我生成基本代码的时间有限:P