首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象/更新对象的/TableModel“

对象/更新对象的/TableModel“
EN

Stack Overflow用户
提问于 2011-06-24 15:01:12
回答 1查看 1.8K关注 0票数 1

我有一个股票对象的集合,我正在实时更新大约10/15个变量。我通过集合中的ID访问每个股票。我还试图在JTable中显示这一点,并实现了一个AbstractTablemodel。效果不太好。

我有一个RowMap,当股票被添加到TableModel中时,我会将每个ID添加到其中。要更新TableModel中所有股票的价格和变量,我希望向updateModel( stocks )方法发送一个Stock。我可以通过搜索映射找到相关的行,但是如何很好地处理这个问题,所以我不必开始遍历表列,并将单元格的值与对象的变量进行比较,以查看是否存在差异?

基本上,我希望向TableModel发送一个Stock,如果有更改,就更新单元格,如果没有更改,则什么也不做。

对于如何实现TableModel有什么想法吗?任何一种便便都会很感激。

谢谢。

编辑:

导入javax.swing.table.AbstractTableModel;导入ppwebsitemonitor.views.OrderTableModel.*;

公共最终类QuoteTableModel扩展AbstractTableModel {

代码语言:javascript
复制
// Attributes
String[] columnName = new String[]{"Stock", "Quantity", "Price", "Side", "Status"};
Class[] columnClass =
        new Class[]{String.class, Integer.class, Double.class, String.class, String.class};
Object[][] rows = null;

public QuoteTableModel() {
}

public QuoteTableModel(Object[][] orders) {
    this.rows = orders;
}

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

public boolean isNew(int row) {
    return rows[row][4].equals(OrderStatus.NEW);
}

public boolean isFilled(int row) {
    return rows[row][4].equals(OrderStatus.FULLY_FILLED);
}

public boolean isCancelled(int row) {
    return rows[row][4].equals(OrderStatus.CANCELLED);
}

public void updateOrderPrice(int row, Double newPrice) {

    Object[] order = rows[row];
    order[2] = newPrice;
    super.fireTableRowsUpdated(row, row);
}

public void updateOrderStatus(int row, int status) {

    Object[] order = rows[row];
    order[4] = OrderStatus.States[status];
    super.fireTableRowsUpdated(row, row);
}

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

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

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

public Class getColumnClass(int col) {
    return columnClass[col];
}

}‘

EN

回答 1

Stack Overflow用户

发布于 2011-06-24 15:06:48

不必将股票ID存储在表模型中,而是可以存储stock对象本身。在你的主收藏中持有的同样的。然后,每次对股票值进行更新时,都向表UI发送刷新(或将其置于定时刷新或程序所需的任何内容中)。

编辑

我包括了一些代码来说明我的意思。它几乎不超过伪代码,您将不得不调整它以适应您的情况。

这是为了模拟您的股票订单对象:

代码语言:javascript
复制
import java.io.Serializable;

public class StockOrder implements Serializable{
    public final class OrderStatus {
        public static final String NEW = "NEW";
        public static final String FULLY_FILLED = "FULLY_FILLED";
        public static final String SHIPPED = "SHIPPED";
        public static final String CANCELLED = "CANCELLED";
    }

    private static final long serialVersionUID = -3627357348101499053L;

    private String ticker;
    private Integer quantity;
    private Double price;
    private String side;
    private String status;

    public StockOrder() {
        super();
    }

    public StockOrder(String ticker, Integer quantity, Double price, String side, String status) {
        this();
        setTicker(ticker);
        setQuantity(quantity);
        setPrice(price);
        setSide(side);
        setStatus(status);
    }

    public Double getPrice() {
        return price;
    }

    public Integer getQuantity() {
        return quantity;
    }

    public String getSide() {
        return side;
    }

    public String getStatus() {
        return status;
    }

    public String getTicker() {
        return ticker;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public void setQuantity(Integer quantity) {
        this.quantity = quantity;
    }

    public void setSide(String side) {
        this.side = side;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setTicker(String ticker) {
        this.ticker = ticker;
    }
}

您的自定义模型应该如下所示:

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.table.AbstractTableModel;

import misc.test.StockOrder.OrderStatus;

public class QuoteTableModel extends AbstractTableModel {

    private static final long serialVersionUID = -8683294701374710538L;

    // Attributes
    String[] columnName = new String[] { "Stock", "Quantity", "Price", "Side",
            "Status" };
    Class<?>[] columnClass = new Class[] { String.class, Integer.class,
            Double.class, String.class, String.class };
    private List<StockOrder> rows = null;
    private Map<String, Integer> orderMap = null;

    public QuoteTableModel() {
        super();
        setRows(new ArrayList<StockOrder>(8));
    }

    public QuoteTableModel(Collection<StockOrder> orders) {
        super();
        if(orders != null) {
            setRows(new ArrayList<StockOrder>(orders));
        } else {
            setRows(new ArrayList<StockOrder>(8));
        }
    }

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

    public boolean isNew(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.NEW.equals(order.getStatus());
    }

    protected List<StockOrder> getRows() {
        return rows;
    }

    protected void setRows(List<StockOrder> rows) {
        this.rows = rows;
        this.orderMap = new HashMap<String, Integer>((rows != null) ? rows.size() : 8);

        if(rows != null) {
            int i = 0;
            for(StockOrder order: rows) {
                orderMap.put(order.getTicker(), new Integer(i++));
            }
        }
    }

    public boolean isFilled(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.FULLY_FILLED.equals(order.getStatus());
    }

    public boolean isCancelled(int row) {
        StockOrder order = getRows().get(row);
        return OrderStatus.CANCELLED.equals(order.getStatus());
    }

    public void updateOrderPrice(int row, Double newPrice) {
        StockOrder order = getRows().get(row);
        if( order != null ) {
            order.setPrice(newPrice);
            super.fireTableRowsUpdated(row, row);
        }
    }

    public void updateOrderPrice(String ticker, Double newPrice) {
        Integer idx = getOrderMap().get(ticker);
        if(idx != null) {
            updateOrderPrice(idx, newPrice);
        }
    }

    public void updateOrderPrice(String ticker, String newStatus) {
        Integer idx = getOrderMap().get(ticker);
        if(idx != null) {
            updateOrderStatus(idx, newStatus);
        }
    }

    public void updateOrderStatus(int row, String newStatus) {
        StockOrder order = getRows().get(row);
        if( order != null ) {
            order.setStatus(newStatus);
            super.fireTableRowsUpdated(row, row);
        }

    }

    public Object getValueAt(int row, int col) {
        StockOrder order = getRows().get(row);
        if(order != null) {

            switch(col) {
                case 0: return order.getTicker() ;
                case 1: return order.getQuantity() ;
                case 2: return order.getPrice() ;
                case 3: return order.getSide() ;
                case 4: return order.getStatus() ;
                default: return "";
            }
        }

        return "";
    }

    public int getRowCount() {
        return getRows().size();
    }

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

    public Class<?> getColumnClass(int col) {
        return columnClass[col];
    }

    protected Map<String, Integer> getOrderMap() {
        return orderMap;
    }

    protected void setOrderMap(Map<String, Integer> orderMap) {
        this.orderMap = orderMap;
    }

}

您可以使用它来测试:

代码语言:javascript
复制
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.table.TableModel;

import misc.test.StockOrder.OrderStatus;

public class QuoteTableApp {
    public static void main(String[] args) {
        QuoteTableApp app = new QuoteTableApp();
        System.out.println(app);
    }

    private JFrame frame = null;

    public QuoteTableApp() {
        super();
        setFrame(new JFrame("Quotes"));
        getFrame().setLocation(500, 300);
        getFrame().setSize(500, 400);

        List<StockOrder> orders = new ArrayList<StockOrder>(4);
        orders.add(new StockOrder("YHOO", 20, 73.50, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("MSFT", 40, 42.00, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("IBM", 100, 126.75, "UP", OrderStatus.NEW));
        orders.add(new StockOrder("CSCO", 5, 29.32, "UP", OrderStatus.NEW));

        TableModel model = new QuoteTableModel(orders);
        JTable table = new JTable(model);

        getFrame().getContentPane().add(table);
        getFrame().setVisible(Boolean.TRUE);

        ((QuoteTableModel) model).updateOrderPrice("CSCO", 31.20);
    }

    protected void setFrame(JFrame frame) {
        this.frame = frame;
    }

    protected JFrame getFrame() {
        return frame;
    }
}

这段代码没有考虑到您可能需要做的任何排序。但基本概念已经存在了。希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6469669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档